@avaprotocol/sdk-js 2.16.0 → 4.0.0-dev.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -0
- package/dist/index.d.ts +1 -370
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +736 -22391
- package/dist/index.mjs +698 -22422
- package/dist/v4/auth.d.ts +54 -0
- package/dist/v4/auth.d.ts.map +1 -0
- package/dist/v4/auth.js +70 -0
- package/dist/v4/builders/nodes.d.ts +103 -0
- package/dist/v4/builders/nodes.d.ts.map +1 -0
- package/dist/v4/builders/nodes.js +132 -0
- package/dist/v4/builders/triggers.d.ts +66 -0
- package/dist/v4/builders/triggers.d.ts.map +1 -0
- package/dist/v4/builders/triggers.js +74 -0
- package/dist/v4/chains.d.ts +16 -0
- package/dist/v4/chains.d.ts.map +1 -0
- package/dist/v4/chains.js +23 -0
- package/dist/v4/client.d.ts +60 -0
- package/dist/v4/client.d.ts.map +1 -0
- package/dist/v4/client.js +53 -0
- package/dist/v4/index.d.ts +18 -0
- package/dist/v4/index.d.ts.map +1 -0
- package/dist/v4/index.js +23 -0
- package/dist/v4/internal/errors.d.ts +36 -0
- package/dist/v4/internal/errors.d.ts.map +1 -0
- package/dist/v4/internal/errors.js +32 -0
- package/dist/v4/internal/transport.d.ts +64 -0
- package/dist/v4/internal/transport.d.ts.map +1 -0
- package/dist/v4/internal/transport.js +133 -0
- package/dist/v4/resources/auth.d.ts +39 -0
- package/dist/v4/resources/auth.d.ts.map +1 -0
- package/dist/v4/resources/auth.js +53 -0
- package/dist/v4/resources/executions.d.ts +68 -0
- package/dist/v4/resources/executions.d.ts.map +1 -0
- package/dist/v4/resources/executions.js +126 -0
- package/dist/v4/resources/health.d.ts +9 -0
- package/dist/v4/resources/health.d.ts.map +1 -0
- package/dist/v4/resources/health.js +9 -0
- package/dist/v4/resources/nodes.d.ts +9 -0
- package/dist/v4/resources/nodes.d.ts.map +1 -0
- package/dist/v4/resources/nodes.js +13 -0
- package/dist/v4/resources/operators.d.ts +9 -0
- package/dist/v4/resources/operators.d.ts.map +1 -0
- package/dist/v4/resources/operators.js +9 -0
- package/dist/v4/resources/secrets.d.ts +24 -0
- package/dist/v4/resources/secrets.d.ts.map +1 -0
- package/dist/v4/resources/secrets.js +28 -0
- package/dist/v4/resources/tokens.d.ts +16 -0
- package/dist/v4/resources/tokens.d.ts.map +1 -0
- package/dist/v4/resources/tokens.js +17 -0
- package/dist/v4/resources/triggers.d.ts +9 -0
- package/dist/v4/resources/triggers.d.ts.map +1 -0
- package/dist/v4/resources/triggers.js +13 -0
- package/dist/v4/resources/wallets.d.ts +25 -0
- package/dist/v4/resources/wallets.d.ts.map +1 -0
- package/dist/v4/resources/wallets.js +45 -0
- package/dist/v4/resources/workflows.d.ts +54 -0
- package/dist/v4/resources/workflows.d.ts.map +1 -0
- package/dist/v4/resources/workflows.js +81 -0
- package/package.json +4 -12
- package/dist/auth.d.ts +0 -2
- package/dist/auth.d.ts.map +0 -1
- package/dist/auth.js +0 -10
- package/dist/config.d.ts +0 -9
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js +0 -19
- package/dist/models/edge.d.ts +0 -12
- package/dist/models/edge.d.ts.map +0 -1
- package/dist/models/edge.js +0 -19
- package/dist/models/execution.d.ts +0 -20
- package/dist/models/execution.d.ts.map +0 -1
- package/dist/models/execution.js +0 -97
- package/dist/models/node/balance.d.ts +0 -17
- package/dist/models/node/balance.d.ts.map +0 -1
- package/dist/models/node/balance.js +0 -78
- package/dist/models/node/branch.d.ts +0 -11
- package/dist/models/node/branch.d.ts.map +0 -1
- package/dist/models/node/branch.js +0 -63
- package/dist/models/node/contractRead.d.ts +0 -17
- package/dist/models/node/contractRead.d.ts.map +0 -1
- package/dist/models/node/contractRead.js +0 -91
- package/dist/models/node/contractWrite.d.ts +0 -17
- package/dist/models/node/contractWrite.d.ts.map +0 -1
- package/dist/models/node/contractWrite.js +0 -102
- package/dist/models/node/customCode.d.ts +0 -20
- package/dist/models/node/customCode.d.ts.map +0 -1
- package/dist/models/node/customCode.js +0 -74
- package/dist/models/node/ethTransfer.d.ts +0 -20
- package/dist/models/node/ethTransfer.d.ts.map +0 -1
- package/dist/models/node/ethTransfer.js +0 -58
- package/dist/models/node/factory.d.ts +0 -24
- package/dist/models/node/factory.d.ts.map +0 -1
- package/dist/models/node/factory.js +0 -108
- package/dist/models/node/filter.d.ts +0 -11
- package/dist/models/node/filter.d.ts.map +0 -1
- package/dist/models/node/filter.js +0 -57
- package/dist/models/node/graphqlQuery.d.ts +0 -21
- package/dist/models/node/graphqlQuery.d.ts.map +0 -1
- package/dist/models/node/graphqlQuery.js +0 -74
- package/dist/models/node/interface.d.ts +0 -20
- package/dist/models/node/interface.d.ts.map +0 -1
- package/dist/models/node/interface.js +0 -58
- package/dist/models/node/loop.d.ts +0 -15
- package/dist/models/node/loop.d.ts.map +0 -1
- package/dist/models/node/loop.js +0 -235
- package/dist/models/node/restApi.d.ts +0 -23
- package/dist/models/node/restApi.d.ts.map +0 -1
- package/dist/models/node/restApi.js +0 -84
- package/dist/models/secret.d.ts +0 -16
- package/dist/models/secret.d.ts.map +0 -1
- package/dist/models/secret.js +0 -28
- package/dist/models/step.d.ts +0 -33
- package/dist/models/step.d.ts.map +0 -1
- package/dist/models/step.js +0 -287
- package/dist/models/trigger/block.d.ts +0 -21
- package/dist/models/trigger/block.d.ts.map +0 -1
- package/dist/models/trigger/block.js +0 -81
- package/dist/models/trigger/cron.d.ts +0 -23
- package/dist/models/trigger/cron.d.ts.map +0 -1
- package/dist/models/trigger/cron.js +0 -77
- package/dist/models/trigger/event.d.ts +0 -22
- package/dist/models/trigger/event.d.ts.map +0 -1
- package/dist/models/trigger/event.js +0 -244
- package/dist/models/trigger/factory.d.ts +0 -27
- package/dist/models/trigger/factory.d.ts.map +0 -1
- package/dist/models/trigger/factory.js +0 -73
- package/dist/models/trigger/fixedTime.d.ts +0 -23
- package/dist/models/trigger/fixedTime.d.ts.map +0 -1
- package/dist/models/trigger/fixedTime.js +0 -69
- package/dist/models/trigger/interface.d.ts +0 -19
- package/dist/models/trigger/interface.d.ts.map +0 -1
- package/dist/models/trigger/interface.js +0 -35
- package/dist/models/trigger/manual.d.ts +0 -16
- package/dist/models/trigger/manual.d.ts.map +0 -1
- package/dist/models/trigger/manual.js +0 -117
- package/dist/models/workflow.d.ts +0 -53
- package/dist/models/workflow.d.ts.map +0 -1
- package/dist/models/workflow.js +0 -219
- package/dist/utils.d.ts +0 -82
- package/dist/utils.d.ts.map +0 -1
- package/dist/utils.js +0 -286
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import Node from "./interface";
|
|
2
|
-
import * as avs_pb from "@/grpc_codegen/avs_pb";
|
|
3
|
-
import { ETHTransferNodeProps } from "@avaprotocol/types";
|
|
4
|
-
declare class ETHTransferNode extends Node {
|
|
5
|
-
constructor(props: ETHTransferNodeProps);
|
|
6
|
-
/**
|
|
7
|
-
* Create a protobuf ETHTransferNode from config data
|
|
8
|
-
* @param configData - The configuration data for the ETH transfer node
|
|
9
|
-
* @returns Configured avs_pb.ETHTransferNode
|
|
10
|
-
*/
|
|
11
|
-
static createProtobufNode(configData: {
|
|
12
|
-
destination: string;
|
|
13
|
-
amount: string;
|
|
14
|
-
}): avs_pb.ETHTransferNode;
|
|
15
|
-
static fromResponse(raw: avs_pb.TaskNode): ETHTransferNode;
|
|
16
|
-
toRequest(): avs_pb.TaskNode;
|
|
17
|
-
static fromOutputData(outputData: avs_pb.RunNodeWithInputsResp): any;
|
|
18
|
-
}
|
|
19
|
-
export default ETHTransferNode;
|
|
20
|
-
//# sourceMappingURL=ethTransfer.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ethTransfer.d.ts","sourceRoot":"","sources":["../../../src/models/node/ethTransfer.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,aAAa,CAAC;AAC/B,OAAO,KAAK,MAAM,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAGL,oBAAoB,EAErB,MAAM,oBAAoB,CAAC;AAK5B,cAAM,eAAgB,SAAQ,IAAI;gBACpB,KAAK,EAAE,oBAAoB;IAIvC;;;;OAIG;IACH,MAAM,CAAC,kBAAkB,CAAC,UAAU,EAAE;QACpC,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,MAAM,CAAC;KAChB,GAAG,MAAM,CAAC,eAAe;IAW1B,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,GAAG,eAAe;IAgB1D,SAAS,IAAI,MAAM,CAAC,QAAQ;IAgB5B,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,MAAM,CAAC,qBAAqB,GAAG,GAAG;CAcrE;AAED,eAAe,eAAe,CAAC"}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import Node from "./interface";
|
|
2
|
-
import * as avs_pb from "@/grpc_codegen/avs_pb";
|
|
3
|
-
import { NodeType, } from "@avaprotocol/types";
|
|
4
|
-
import { convertProtobufValueToJs } from "../../utils";
|
|
5
|
-
// Required props for constructor: id, name, type and data: { destination, amount }
|
|
6
|
-
class ETHTransferNode extends Node {
|
|
7
|
-
constructor(props) {
|
|
8
|
-
super({ ...props, type: NodeType.ETHTransfer, data: props.data });
|
|
9
|
-
}
|
|
10
|
-
/**
|
|
11
|
-
* Create a protobuf ETHTransferNode from config data
|
|
12
|
-
* @param configData - The configuration data for the ETH transfer node
|
|
13
|
-
* @returns Configured avs_pb.ETHTransferNode
|
|
14
|
-
*/
|
|
15
|
-
static createProtobufNode(configData) {
|
|
16
|
-
const node = new avs_pb.ETHTransferNode();
|
|
17
|
-
const config = new avs_pb.ETHTransferNode.Config();
|
|
18
|
-
config.setDestination(configData.destination);
|
|
19
|
-
config.setAmount(configData.amount);
|
|
20
|
-
node.setConfig(config);
|
|
21
|
-
return node;
|
|
22
|
-
}
|
|
23
|
-
static fromResponse(raw) {
|
|
24
|
-
// Convert the raw object to ETHTransferNodeProps, which should keep name and id
|
|
25
|
-
const obj = raw.toObject();
|
|
26
|
-
const data = raw
|
|
27
|
-
.getEthTransfer()
|
|
28
|
-
.getConfig()
|
|
29
|
-
.toObject();
|
|
30
|
-
return new ETHTransferNode({
|
|
31
|
-
...obj,
|
|
32
|
-
type: NodeType.ETHTransfer,
|
|
33
|
-
data: data,
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
toRequest() {
|
|
37
|
-
const request = new avs_pb.TaskNode();
|
|
38
|
-
request.setId(this.id);
|
|
39
|
-
request.setName(this.name);
|
|
40
|
-
request.setType(avs_pb.NodeType.NODE_TYPE_ETH_TRANSFER);
|
|
41
|
-
const node = ETHTransferNode.createProtobufNode(this.data);
|
|
42
|
-
request.setEthTransfer(node);
|
|
43
|
-
return request;
|
|
44
|
-
}
|
|
45
|
-
static fromOutputData(outputData) {
|
|
46
|
-
const ethTransferOutput = outputData.getEthTransfer();
|
|
47
|
-
if (!ethTransferOutput) {
|
|
48
|
-
return null;
|
|
49
|
-
}
|
|
50
|
-
// Use convertProtobufValueToJs to get clean JavaScript objects
|
|
51
|
-
const rawData = ethTransferOutput.getData();
|
|
52
|
-
if (rawData) {
|
|
53
|
-
return convertProtobufValueToJs(rawData);
|
|
54
|
-
}
|
|
55
|
-
return null;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
export default ETHTransferNode;
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import * as avs_pb from "@/grpc_codegen/avs_pb";
|
|
2
|
-
import ContractWriteNode from "./contractWrite";
|
|
3
|
-
import CustomCodeNode from "./customCode";
|
|
4
|
-
import GraphQLQueryNode from "./graphqlQuery";
|
|
5
|
-
import Node from "./interface";
|
|
6
|
-
import RestAPINode from "./restApi";
|
|
7
|
-
import ContractReadNode from "./contractRead";
|
|
8
|
-
import ETHTransferNode from "./ethTransfer";
|
|
9
|
-
import BranchNode from "./branch";
|
|
10
|
-
import FilterNode from "./filter";
|
|
11
|
-
import LoopNode from "./loop";
|
|
12
|
-
import BalanceNode from "./balance";
|
|
13
|
-
import { ContractWriteNodeData, ContractReadNodeData, BranchNodeData, ETHTransferNodeData, GraphQLQueryNodeData, RestAPINodeData, CustomCodeNodeData, FilterNodeData, LoopNodeData, BalanceNodeData, NodeProps, ContractWriteNodeProps, ContractReadNodeProps, BranchNodeProps, ETHTransferNodeProps, GraphQLQueryNodeProps, RestAPINodeProps, CustomCodeNodeProps, FilterNodeProps, LoopNodeProps, BalanceNodeProps } from "@avaprotocol/types";
|
|
14
|
-
declare class NodeFactory {
|
|
15
|
-
static create(props: NodeProps): Node;
|
|
16
|
-
static createNodes(props: NodeProps[]): Node[];
|
|
17
|
-
static fromResponse(raw: avs_pb.TaskNode): Node;
|
|
18
|
-
static fromOutputData(outputData: avs_pb.RunNodeWithInputsResp): any;
|
|
19
|
-
}
|
|
20
|
-
export default NodeFactory;
|
|
21
|
-
export { Node, ContractWriteNode, ContractReadNode, BranchNode, ETHTransferNode, GraphQLQueryNode, RestAPINode, CustomCodeNode, FilterNode, LoopNode, BalanceNode, };
|
|
22
|
-
export type { ContractWriteNodeData, ContractReadNodeData, BranchNodeData, ETHTransferNodeData, GraphQLQueryNodeData, RestAPINodeData, CustomCodeNodeData, FilterNodeData, LoopNodeData, BalanceNodeData, };
|
|
23
|
-
export type { NodeProps, ContractWriteNodeProps, ContractReadNodeProps, BranchNodeProps, ETHTransferNodeProps, GraphQLQueryNodeProps, RestAPINodeProps, CustomCodeNodeProps, FilterNodeProps, LoopNodeProps, BalanceNodeProps, };
|
|
24
|
-
//# sourceMappingURL=factory.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../../src/models/node/factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,uBAAuB,CAAC;AAEhD,OAAO,iBAAiB,MAAM,iBAAiB,CAAC;AAChD,OAAO,cAAc,MAAM,cAAc,CAAC;AAC1C,OAAO,gBAAgB,MAAM,gBAAgB,CAAC;AAC9C,OAAO,IAAI,MAAM,aAAa,CAAC;AAC/B,OAAO,WAAW,MAAM,WAAW,CAAC;AACpC,OAAO,gBAAgB,MAAM,gBAAgB,CAAC;AAC9C,OAAO,eAAe,MAAM,eAAe,CAAC;AAC5C,OAAO,UAAU,MAAM,UAAU,CAAC;AAClC,OAAO,UAAU,MAAM,UAAU,CAAC;AAClC,OAAO,QAAQ,MAAM,QAAQ,CAAC;AAC9B,OAAO,WAAW,MAAM,WAAW,CAAC;AACpC,OAAO,EAEL,qBAAqB,EACrB,oBAAoB,EACpB,cAAc,EACd,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,YAAY,EACZ,eAAe,EACf,SAAS,EACT,sBAAsB,EACtB,qBAAqB,EACrB,eAAe,EACf,oBAAoB,EACpB,qBAAqB,EACrB,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,aAAa,EACb,gBAAgB,EACjB,MAAM,oBAAoB,CAAC;AAE5B,cAAM,WAAW;IACf,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IA6BrC,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE;IAI9C,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,GAAG,IAAI;IA2B/C,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,MAAM,CAAC,qBAAqB,GAAG,GAAG;CAiCrE;AAED,eAAe,WAAW,CAAC;AAG3B,OAAO,EACL,IAAI,EACJ,iBAAiB,EACjB,gBAAgB,EAChB,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,WAAW,EACX,cAAc,EACd,UAAU,EACV,QAAQ,EACR,WAAW,GACZ,CAAC;AAGF,YAAY,EACV,qBAAqB,EACrB,oBAAoB,EACpB,cAAc,EACd,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,YAAY,EACZ,eAAe,GAChB,CAAC;AAGF,YAAY,EACV,SAAS,EACT,sBAAsB,EACtB,qBAAqB,EACrB,eAAe,EACf,oBAAoB,EACpB,qBAAqB,EACrB,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,aAAa,EACb,gBAAgB,GACjB,CAAC"}
|
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
import * as avs_pb from "@/grpc_codegen/avs_pb";
|
|
2
|
-
import _ from "lodash";
|
|
3
|
-
import ContractWriteNode from "./contractWrite";
|
|
4
|
-
import CustomCodeNode from "./customCode";
|
|
5
|
-
import GraphQLQueryNode from "./graphqlQuery";
|
|
6
|
-
import Node from "./interface";
|
|
7
|
-
import RestAPINode from "./restApi";
|
|
8
|
-
import ContractReadNode from "./contractRead";
|
|
9
|
-
import ETHTransferNode from "./ethTransfer";
|
|
10
|
-
import BranchNode from "./branch";
|
|
11
|
-
import FilterNode from "./filter";
|
|
12
|
-
import LoopNode from "./loop";
|
|
13
|
-
import BalanceNode from "./balance";
|
|
14
|
-
import { NodeType } from "@avaprotocol/types";
|
|
15
|
-
class NodeFactory {
|
|
16
|
-
static create(props) {
|
|
17
|
-
switch (props.type) {
|
|
18
|
-
case NodeType.ContractWrite:
|
|
19
|
-
return new ContractWriteNode(props);
|
|
20
|
-
case NodeType.RestAPI:
|
|
21
|
-
return new RestAPINode(props);
|
|
22
|
-
case NodeType.CustomCode:
|
|
23
|
-
return new CustomCodeNode(props);
|
|
24
|
-
case NodeType.ContractRead:
|
|
25
|
-
return new ContractReadNode(props);
|
|
26
|
-
case NodeType.ETHTransfer:
|
|
27
|
-
return new ETHTransferNode(props);
|
|
28
|
-
case NodeType.GraphQLQuery:
|
|
29
|
-
return new GraphQLQueryNode(props);
|
|
30
|
-
case NodeType.Branch:
|
|
31
|
-
return new BranchNode(props);
|
|
32
|
-
case NodeType.Filter:
|
|
33
|
-
return new FilterNode(props);
|
|
34
|
-
case NodeType.Loop:
|
|
35
|
-
return new LoopNode(props);
|
|
36
|
-
case NodeType.Balance:
|
|
37
|
-
return new BalanceNode(props);
|
|
38
|
-
case NodeType.Unspecified:
|
|
39
|
-
throw new Error("Cannot create node with unspecified type");
|
|
40
|
-
default:
|
|
41
|
-
throw new Error(`Unsupported node type: ${props.type}`);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
static createNodes(props) {
|
|
45
|
-
return _.map(props, (node) => this.create(node));
|
|
46
|
-
}
|
|
47
|
-
static fromResponse(raw) {
|
|
48
|
-
switch (true) {
|
|
49
|
-
case !!raw.getEthTransfer():
|
|
50
|
-
return ETHTransferNode.fromResponse(raw);
|
|
51
|
-
case !!raw.getContractRead():
|
|
52
|
-
return ContractReadNode.fromResponse(raw);
|
|
53
|
-
case !!raw.getContractWrite():
|
|
54
|
-
return ContractWriteNode.fromResponse(raw);
|
|
55
|
-
case !!raw.getGraphqlQuery():
|
|
56
|
-
return GraphQLQueryNode.fromResponse(raw);
|
|
57
|
-
case !!raw.getRestApi():
|
|
58
|
-
return RestAPINode.fromResponse(raw);
|
|
59
|
-
case !!raw.getCustomCode():
|
|
60
|
-
return CustomCodeNode.fromResponse(raw);
|
|
61
|
-
case !!raw.getBranch():
|
|
62
|
-
return BranchNode.fromResponse(raw);
|
|
63
|
-
case !!raw.getFilter():
|
|
64
|
-
return FilterNode.fromResponse(raw);
|
|
65
|
-
case !!raw.getLoop():
|
|
66
|
-
return LoopNode.fromResponse(raw);
|
|
67
|
-
case !!raw.getBalance():
|
|
68
|
-
return BalanceNode.fromResponse(raw);
|
|
69
|
-
default:
|
|
70
|
-
throw new Error(`Unsupported node type: ${raw.getName()}`);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
static fromOutputData(outputData) {
|
|
74
|
-
// Delegate to the specific node type's fromOutputData method
|
|
75
|
-
// This is the correct approach, similar to how TriggerFactory.fromOutputData works
|
|
76
|
-
switch (outputData.getOutputDataCase()) {
|
|
77
|
-
case avs_pb.RunNodeWithInputsResp.OutputDataCase.REST_API:
|
|
78
|
-
return RestAPINode.fromOutputData(outputData);
|
|
79
|
-
case avs_pb.RunNodeWithInputsResp.OutputDataCase.CUSTOM_CODE:
|
|
80
|
-
return CustomCodeNode.fromOutputData(outputData);
|
|
81
|
-
case avs_pb.RunNodeWithInputsResp.OutputDataCase.CONTRACT_READ:
|
|
82
|
-
return ContractReadNode.fromOutputData(outputData);
|
|
83
|
-
case avs_pb.RunNodeWithInputsResp.OutputDataCase.CONTRACT_WRITE:
|
|
84
|
-
return ContractWriteNode.fromOutputData(outputData);
|
|
85
|
-
case avs_pb.RunNodeWithInputsResp.OutputDataCase.ETH_TRANSFER:
|
|
86
|
-
return ETHTransferNode.fromOutputData(outputData);
|
|
87
|
-
case avs_pb.RunNodeWithInputsResp.OutputDataCase.GRAPHQL:
|
|
88
|
-
return GraphQLQueryNode.fromOutputData(outputData);
|
|
89
|
-
case avs_pb.RunNodeWithInputsResp.OutputDataCase.BRANCH:
|
|
90
|
-
return BranchNode.fromOutputData(outputData);
|
|
91
|
-
case avs_pb.RunNodeWithInputsResp.OutputDataCase.FILTER:
|
|
92
|
-
return FilterNode.fromOutputData(outputData);
|
|
93
|
-
case avs_pb.RunNodeWithInputsResp.OutputDataCase.LOOP:
|
|
94
|
-
return LoopNode.fromOutputData(outputData);
|
|
95
|
-
case avs_pb.RunNodeWithInputsResp.OutputDataCase.BALANCE:
|
|
96
|
-
return BalanceNode.fromOutputData(outputData);
|
|
97
|
-
case avs_pb.RunNodeWithInputsResp.OutputDataCase.OUTPUT_DATA_NOT_SET:
|
|
98
|
-
// Some node types may not return output data (e.g., FilterNode with no matches)
|
|
99
|
-
// Return null to indicate no output data
|
|
100
|
-
return null;
|
|
101
|
-
default:
|
|
102
|
-
throw new Error(`Unsupported output data case: ${outputData.getOutputDataCase()}`);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
export default NodeFactory;
|
|
107
|
-
// Node object definitions
|
|
108
|
-
export { Node, ContractWriteNode, ContractReadNode, BranchNode, ETHTransferNode, GraphQLQueryNode, RestAPINode, CustomCodeNode, FilterNode, LoopNode, BalanceNode, };
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import Node from "./interface";
|
|
2
|
-
import * as avs_pb from "@/grpc_codegen/avs_pb";
|
|
3
|
-
import { FilterNodeProps } from "@avaprotocol/types";
|
|
4
|
-
declare class FilterNode extends Node {
|
|
5
|
-
constructor(props: FilterNodeProps);
|
|
6
|
-
static fromResponse(raw: avs_pb.TaskNode): FilterNode;
|
|
7
|
-
toRequest(): avs_pb.TaskNode;
|
|
8
|
-
static fromOutputData(outputData: avs_pb.RunNodeWithInputsResp): unknown[];
|
|
9
|
-
}
|
|
10
|
-
export default FilterNode;
|
|
11
|
-
//# sourceMappingURL=filter.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"filter.d.ts","sourceRoot":"","sources":["../../../src/models/node/filter.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,aAAa,CAAC;AAC/B,OAAO,KAAK,MAAM,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAGL,eAAe,EAEhB,MAAM,oBAAoB,CAAC;AAI5B,cAAM,UAAW,SAAQ,IAAI;gBACf,KAAK,EAAE,eAAe;IAIlC,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,GAAG,UAAU;IAWrD,SAAS,IAAI,MAAM,CAAC,QAAQ;IAkB5B,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,MAAM,CAAC,qBAAqB,GAAG,OAAO,EAAE;CAoC3E;AAED,eAAe,UAAU,CAAC"}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import Node from "./interface";
|
|
2
|
-
import * as avs_pb from "@/grpc_codegen/avs_pb";
|
|
3
|
-
import { NodeType, } from "@avaprotocol/types";
|
|
4
|
-
// Required props for constructor: id, name, type and data: { expression, inputVariable }
|
|
5
|
-
class FilterNode extends Node {
|
|
6
|
-
constructor(props) {
|
|
7
|
-
super({ ...props, type: NodeType.Filter, data: props.data });
|
|
8
|
-
}
|
|
9
|
-
static fromResponse(raw) {
|
|
10
|
-
// Convert the raw object to FilterNodeProps, which should keep name and id
|
|
11
|
-
const obj = raw.toObject();
|
|
12
|
-
return new FilterNode({
|
|
13
|
-
...obj,
|
|
14
|
-
type: NodeType.Filter,
|
|
15
|
-
data: raw.getFilter().getConfig().toObject(),
|
|
16
|
-
});
|
|
17
|
-
}
|
|
18
|
-
toRequest() {
|
|
19
|
-
const request = new avs_pb.TaskNode();
|
|
20
|
-
request.setId(this.id);
|
|
21
|
-
request.setName(this.name);
|
|
22
|
-
request.setType(avs_pb.NodeType.NODE_TYPE_FILTER);
|
|
23
|
-
const node = new avs_pb.FilterNode();
|
|
24
|
-
const config = new avs_pb.FilterNode.Config();
|
|
25
|
-
config.setExpression(this.data.expression);
|
|
26
|
-
config.setInputVariable(this.data.inputVariable || "");
|
|
27
|
-
node.setConfig(config);
|
|
28
|
-
request.setFilter(node);
|
|
29
|
-
return request;
|
|
30
|
-
}
|
|
31
|
-
static fromOutputData(outputData) {
|
|
32
|
-
const filterOutput = outputData.getFilter();
|
|
33
|
-
if (!filterOutput) {
|
|
34
|
-
throw new Error("FilterNode output data is missing");
|
|
35
|
-
}
|
|
36
|
-
const anyData = filterOutput.getData();
|
|
37
|
-
if (!anyData) {
|
|
38
|
-
throw new Error("FilterNode output data.getData() is missing");
|
|
39
|
-
}
|
|
40
|
-
// The data is now directly a Value containing the filtered array
|
|
41
|
-
const result = anyData.toJavaScript();
|
|
42
|
-
// If result is already an array, return it directly (this should be the normal case now)
|
|
43
|
-
if (Array.isArray(result)) {
|
|
44
|
-
return result;
|
|
45
|
-
}
|
|
46
|
-
// Fallback: if result is an object with data field
|
|
47
|
-
if (result &&
|
|
48
|
-
typeof result === "object" &&
|
|
49
|
-
!Array.isArray(result) &&
|
|
50
|
-
result.data &&
|
|
51
|
-
Array.isArray(result.data)) {
|
|
52
|
-
return result.data;
|
|
53
|
-
}
|
|
54
|
-
throw new Error("FilterNode output data does not contain expected data structure");
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
export default FilterNode;
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import Node from "./interface";
|
|
2
|
-
import * as avs_pb from "@/grpc_codegen/avs_pb";
|
|
3
|
-
import { GraphQLQueryNodeProps } from "@avaprotocol/types";
|
|
4
|
-
declare class GraphQLQueryNode extends Node {
|
|
5
|
-
constructor(props: GraphQLQueryNodeProps);
|
|
6
|
-
/**
|
|
7
|
-
* Create a protobuf GraphQLQueryNode from config data
|
|
8
|
-
* @param configData - The configuration data for the GraphQL query node
|
|
9
|
-
* @returns Configured avs_pb.GraphQLQueryNode
|
|
10
|
-
*/
|
|
11
|
-
static createProtobufNode(configData: {
|
|
12
|
-
url: string;
|
|
13
|
-
query: string;
|
|
14
|
-
variables?: Record<string, string>;
|
|
15
|
-
}): avs_pb.GraphQLQueryNode;
|
|
16
|
-
static fromResponse(raw: avs_pb.TaskNode): GraphQLQueryNode;
|
|
17
|
-
toRequest(): avs_pb.TaskNode;
|
|
18
|
-
static fromOutputData(outputData: avs_pb.RunNodeWithInputsResp): Record<string, unknown> | null;
|
|
19
|
-
}
|
|
20
|
-
export default GraphQLQueryNode;
|
|
21
|
-
//# sourceMappingURL=graphqlQuery.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"graphqlQuery.d.ts","sourceRoot":"","sources":["../../../src/models/node/graphqlQuery.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,aAAa,CAAC;AAC/B,OAAO,KAAK,MAAM,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAGL,qBAAqB,EAEtB,MAAM,oBAAoB,CAAC;AAK5B,cAAM,gBAAiB,SAAQ,IAAI;gBACrB,KAAK,EAAE,qBAAqB;IAQxC;;;;OAIG;IACH,MAAM,CAAC,kBAAkB,CAAC,UAAU,EAAE;QACpC,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACpC,GAAG,MAAM,CAAC,gBAAgB;IAkB3B,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,GAAG,gBAAgB;IAuB3D,SAAS,IAAI,MAAM,CAAC,QAAQ;IAgB5B,MAAM,CAAC,cAAc,CACnB,UAAU,EAAE,MAAM,CAAC,qBAAqB,GACvC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;CAclC;AAED,eAAe,gBAAgB,CAAC"}
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import Node from "./interface";
|
|
2
|
-
import * as avs_pb from "@/grpc_codegen/avs_pb";
|
|
3
|
-
import { NodeType, } from "@avaprotocol/types";
|
|
4
|
-
import { convertProtobufValueToJs } from "../../utils";
|
|
5
|
-
// Required props for constructor: id, name, type and data: { url, query, variablesMap }
|
|
6
|
-
class GraphQLQueryNode extends Node {
|
|
7
|
-
constructor(props) {
|
|
8
|
-
super({
|
|
9
|
-
...props,
|
|
10
|
-
type: NodeType.GraphQLQuery,
|
|
11
|
-
data: props.data,
|
|
12
|
-
});
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Create a protobuf GraphQLQueryNode from config data
|
|
16
|
-
* @param configData - The configuration data for the GraphQL query node
|
|
17
|
-
* @returns Configured avs_pb.GraphQLQueryNode
|
|
18
|
-
*/
|
|
19
|
-
static createProtobufNode(configData) {
|
|
20
|
-
const node = new avs_pb.GraphQLQueryNode();
|
|
21
|
-
const config = new avs_pb.GraphQLQueryNode.Config();
|
|
22
|
-
config.setUrl(configData.url);
|
|
23
|
-
config.setQuery(configData.query);
|
|
24
|
-
if (configData.variables && Object.keys(configData.variables).length > 0) {
|
|
25
|
-
const variablesMap = config.getVariablesMap();
|
|
26
|
-
Object.entries(configData.variables).forEach(([key, value]) => {
|
|
27
|
-
variablesMap.set(key, value);
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
node.setConfig(config);
|
|
31
|
-
return node;
|
|
32
|
-
}
|
|
33
|
-
static fromResponse(raw) {
|
|
34
|
-
// Convert the raw object to GraphQLQueryNodeProps, which should keep name and id
|
|
35
|
-
const obj = raw.toObject();
|
|
36
|
-
const config = raw.getGraphqlQuery().getConfig();
|
|
37
|
-
const variablesMap = config.getVariablesMap();
|
|
38
|
-
const variables = {};
|
|
39
|
-
variablesMap.forEach((value, key) => {
|
|
40
|
-
variables[key] = value;
|
|
41
|
-
});
|
|
42
|
-
return new GraphQLQueryNode({
|
|
43
|
-
...obj,
|
|
44
|
-
type: NodeType.GraphQLQuery,
|
|
45
|
-
data: {
|
|
46
|
-
url: config.getUrl(),
|
|
47
|
-
query: config.getQuery(),
|
|
48
|
-
variables: variables,
|
|
49
|
-
},
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
toRequest() {
|
|
53
|
-
const request = new avs_pb.TaskNode();
|
|
54
|
-
request.setId(this.id);
|
|
55
|
-
request.setName(this.name);
|
|
56
|
-
request.setType(avs_pb.NodeType.NODE_TYPE_GRAPHQL_QUERY);
|
|
57
|
-
const node = GraphQLQueryNode.createProtobufNode(this.data);
|
|
58
|
-
request.setGraphqlQuery(node);
|
|
59
|
-
return request;
|
|
60
|
-
}
|
|
61
|
-
static fromOutputData(outputData) {
|
|
62
|
-
const graphqlOutput = outputData.getGraphql();
|
|
63
|
-
if (!graphqlOutput) {
|
|
64
|
-
return null;
|
|
65
|
-
}
|
|
66
|
-
// Use convertProtobufValueToJs to get clean JavaScript objects
|
|
67
|
-
const rawData = graphqlOutput.getData();
|
|
68
|
-
if (rawData) {
|
|
69
|
-
return convertProtobufValueToJs(rawData);
|
|
70
|
-
}
|
|
71
|
-
return null;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
export default GraphQLQueryNode;
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import * as avs_pb from "@/grpc_codegen/avs_pb";
|
|
2
|
-
import { NodeType, NodeProps, NodeData } from "@avaprotocol/types";
|
|
3
|
-
export declare function covertNodeTypeToString(status: avs_pb.TaskNode.TaskTypeCase): NodeType;
|
|
4
|
-
export type ProtobufNodeProps = Omit<avs_pb.TaskNode.AsObject, "ethTransfer" | "contractWrite" | "contractRead" | "graphqlDataQuery" | "restApi" | "branch" | "filter" | "loop" | "customCode"> & {
|
|
5
|
-
data: any;
|
|
6
|
-
};
|
|
7
|
-
export declare const ProtobufNodePropsUtils: {
|
|
8
|
-
getGoStringType: (props: ProtobufNodeProps) => string;
|
|
9
|
-
fromGoStringType: (goStringType: string, baseProps: Omit<ProtobufNodeProps, "type">) => ProtobufNodeProps;
|
|
10
|
-
};
|
|
11
|
-
export default abstract class Node implements NodeProps {
|
|
12
|
-
id: string;
|
|
13
|
-
name: string;
|
|
14
|
-
type: NodeType;
|
|
15
|
-
data: NodeData;
|
|
16
|
-
constructor(props: NodeProps);
|
|
17
|
-
toRequest(): avs_pb.TaskNode;
|
|
18
|
-
static fromResponse(raw: avs_pb.TaskNode): Node;
|
|
19
|
-
}
|
|
20
|
-
//# sourceMappingURL=interface.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../../src/models/node/interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,uBAAuB,CAAC;AAChD,OAAO,EACL,QAAQ,EAER,SAAS,EACT,QAAQ,EACT,MAAM,oBAAoB,CAAC;AAI5B,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,YAAY,GACnC,QAAQ,CAgBV;AAGD,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAClC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EACtB,aAAa,GACb,eAAe,GACf,cAAc,GACd,kBAAkB,GAClB,SAAS,GACT,QAAQ,GACR,QAAQ,GACR,MAAM,GACN,YAAY,CACf,GAAG;IAEF,IAAI,EAAE,GAAG,CAAC;CACX,CAAC;AAGF,eAAO,MAAM,sBAAsB;6BAER,iBAAiB,KAAG,MAAM;qCAMnC,MAAM,aACT,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,KACzC,iBAAiB;CAMrB,CAAC;AAEF,MAAM,CAAC,OAAO,CAAC,QAAQ,OAAO,IAAK,YAAW,SAAS;IACrD,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,QAAQ,CAAC;gBAEH,KAAK,EAAE,SAAS;IAO5B,SAAS,IAAI,MAAM,CAAC,QAAQ;IAW5B,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,GAAG,IAAI;CAQhD"}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import * as avs_pb from "@/grpc_codegen/avs_pb";
|
|
2
|
-
import { NodeType, NodeTypeGoConverter, } from "@avaprotocol/types";
|
|
3
|
-
import _ from "lodash";
|
|
4
|
-
// Function to convert TaskStatus to string
|
|
5
|
-
export function covertNodeTypeToString(status) {
|
|
6
|
-
const conversionMap = {
|
|
7
|
-
[avs_pb.TaskNode.TaskTypeCase.ETH_TRANSFER]: NodeType.ETHTransfer,
|
|
8
|
-
[avs_pb.TaskNode.TaskTypeCase.CONTRACT_WRITE]: NodeType.ContractWrite,
|
|
9
|
-
[avs_pb.TaskNode.TaskTypeCase.CONTRACT_READ]: NodeType.ContractRead,
|
|
10
|
-
[avs_pb.TaskNode.TaskTypeCase.GRAPHQL_QUERY]: NodeType.GraphQLQuery,
|
|
11
|
-
[avs_pb.TaskNode.TaskTypeCase.REST_API]: NodeType.RestAPI,
|
|
12
|
-
[avs_pb.TaskNode.TaskTypeCase.BRANCH]: NodeType.Branch,
|
|
13
|
-
[avs_pb.TaskNode.TaskTypeCase.FILTER]: NodeType.Filter,
|
|
14
|
-
[avs_pb.TaskNode.TaskTypeCase.LOOP]: NodeType.Loop,
|
|
15
|
-
[avs_pb.TaskNode.TaskTypeCase.CUSTOM_CODE]: NodeType.CustomCode,
|
|
16
|
-
[avs_pb.TaskNode.TaskTypeCase.BALANCE]: NodeType.Balance,
|
|
17
|
-
[avs_pb.TaskNode.TaskTypeCase.TASK_TYPE_NOT_SET]: NodeType.Unspecified,
|
|
18
|
-
};
|
|
19
|
-
return conversionMap[status];
|
|
20
|
-
}
|
|
21
|
-
// Utility functions to work with protobuf NodeProps
|
|
22
|
-
export const ProtobufNodePropsUtils = {
|
|
23
|
-
// Get the Go backend string representation of the node type
|
|
24
|
-
getGoStringType: (props) => {
|
|
25
|
-
return NodeTypeGoConverter.toGoString(props.type);
|
|
26
|
-
},
|
|
27
|
-
// Create ProtobufNodeProps from Go string type
|
|
28
|
-
fromGoStringType: (goStringType, baseProps) => {
|
|
29
|
-
return {
|
|
30
|
-
...baseProps,
|
|
31
|
-
type: NodeTypeGoConverter.fromGoString(goStringType),
|
|
32
|
-
};
|
|
33
|
-
},
|
|
34
|
-
};
|
|
35
|
-
export default class Node {
|
|
36
|
-
constructor(props) {
|
|
37
|
-
this.id = props.id;
|
|
38
|
-
this.name = props.name;
|
|
39
|
-
this.type = props.type;
|
|
40
|
-
this.data = props.data;
|
|
41
|
-
}
|
|
42
|
-
toRequest() {
|
|
43
|
-
const request = new avs_pb.TaskNode();
|
|
44
|
-
const raw = request.serializeBinary();
|
|
45
|
-
const parsed = avs_pb.TaskNode.deserializeBinary(raw);
|
|
46
|
-
if (!_.isEqual(request, parsed)) {
|
|
47
|
-
throw new Error("Invalid request object");
|
|
48
|
-
}
|
|
49
|
-
return request;
|
|
50
|
-
}
|
|
51
|
-
static fromResponse(raw) {
|
|
52
|
-
// Convert the raw object to NodeProps, which should keep name and id
|
|
53
|
-
const obj = raw.toObject();
|
|
54
|
-
return new this({
|
|
55
|
-
...obj,
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import * as avs_pb from "@/grpc_codegen/avs_pb";
|
|
2
|
-
import Node from "./interface";
|
|
3
|
-
import { LoopNodeProps } from "@avaprotocol/types";
|
|
4
|
-
declare class LoopNode extends Node {
|
|
5
|
-
constructor(props: LoopNodeProps);
|
|
6
|
-
static fromResponse(raw: avs_pb.TaskNode): LoopNode;
|
|
7
|
-
private static extractRunnerFromProtobuf;
|
|
8
|
-
private static mapExecutionModeFromProtobuf;
|
|
9
|
-
private mapExecutionModeToProtobuf;
|
|
10
|
-
toRequest(): avs_pb.TaskNode;
|
|
11
|
-
private setRunnerOnProtobuf;
|
|
12
|
-
static fromOutputData(outputData: avs_pb.RunNodeWithInputsResp): unknown;
|
|
13
|
-
}
|
|
14
|
-
export default LoopNode;
|
|
15
|
-
//# sourceMappingURL=loop.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"loop.d.ts","sourceRoot":"","sources":["../../../src/models/node/loop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,uBAAuB,CAAC;AAChD,OAAO,IAAI,MAAM,aAAa,CAAC;AAO/B,OAAO,EAGL,aAAa,EAKd,MAAM,oBAAoB,CAAC;AAG5B,cAAM,QAAS,SAAQ,IAAI;gBACb,KAAK,EAAE,aAAa;IAIhC,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,GAAG,QAAQ;IA4BnD,OAAO,CAAC,MAAM,CAAC,yBAAyB;IAsBxC,OAAO,CAAC,MAAM,CAAC,4BAA4B;IAe3C,OAAO,CAAC,0BAA0B;IA4BlC,SAAS,IAAI,MAAM,CAAC,QAAQ;IAoC5B,OAAO,CAAC,mBAAmB;IAuH3B,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,MAAM,CAAC,qBAAqB,GAAG,OAAO;CAkCzE;AAED,eAAe,QAAQ,CAAC"}
|