blob: 4dd8dbd97750a2128d09f0cab7ea226fab2c4d6f [file] [log] [blame]
import {createTwirpRequest, throwTwirpError, Fetch} from './twirp';
export enum TaskStatus {
TASK_STATUS_PENDING = "TASK_STATUS_PENDING",
TASK_STATUS_RUNNING = "TASK_STATUS_RUNNING",
TASK_STATUS_SUCCESS = "TASK_STATUS_SUCCESS",
TASK_STATUS_FAILURE = "TASK_STATUS_FAILURE",
TASK_STATUS_MISHAP = "TASK_STATUS_MISHAP",
}
export enum JobStatus {
JOB_STATUS_IN_PROGRESS = "JOB_STATUS_IN_PROGRESS",
JOB_STATUS_SUCCESS = "JOB_STATUS_SUCCESS",
JOB_STATUS_FAILURE = "JOB_STATUS_FAILURE",
JOB_STATUS_MISHAP = "JOB_STATUS_MISHAP",
JOB_STATUS_CANCELED = "JOB_STATUS_CANCELED",
}
export interface TriggerJob {
jobName: string;
commitHash: string;
}
interface TriggerJobJSON {
job_name?: string;
commit_hash?: string;
}
const TriggerJobToJSON = (m: TriggerJob): TriggerJobJSON => {
return {
job_name: m.jobName,
commit_hash: m.commitHash,
};
};
export interface TriggerJobsRequest {
jobs?: TriggerJob[];
}
interface TriggerJobsRequestJSON {
jobs?: TriggerJobJSON[];
}
const TriggerJobsRequestToJSON = (m: TriggerJobsRequest): TriggerJobsRequestJSON => {
return {
jobs: m.jobs && m.jobs.map(TriggerJobToJSON),
};
};
export interface TriggerJobsResponse {
jobIds?: string[];
}
interface TriggerJobsResponseJSON {
job_ids?: string[];
}
const JSONToTriggerJobsResponse = (m: TriggerJobsResponseJSON): TriggerJobsResponse => {
return {
jobIds: m.job_ids,
};
};
export interface GetJobRequest {
id: string;
}
interface GetJobRequestJSON {
id?: string;
}
const GetJobRequestToJSON = (m: GetJobRequest): GetJobRequestJSON => {
return {
id: m.id,
};
};
export interface GetJobResponse {
job?: Job;
}
interface GetJobResponseJSON {
job?: JobJSON;
}
const JSONToGetJobResponse = (m: GetJobResponseJSON): GetJobResponse => {
return {
job: m.job && JSONToJob(m.job),
};
};
export interface CancelJobRequest {
id: string;
}
interface CancelJobRequestJSON {
id?: string;
}
const CancelJobRequestToJSON = (m: CancelJobRequest): CancelJobRequestJSON => {
return {
id: m.id,
};
};
export interface CancelJobResponse {
job?: Job;
}
interface CancelJobResponseJSON {
job?: JobJSON;
}
const JSONToCancelJobResponse = (m: CancelJobResponseJSON): CancelJobResponse => {
return {
job: m.job && JSONToJob(m.job),
};
};
export interface SearchJobsRequest {
buildbucketBuildId: string;
hasBuildbucketBuildId: boolean;
isForce: boolean;
hasIsForce: boolean;
issue: string;
hasIssue: boolean;
name: string;
hasName: boolean;
patchset: string;
hasPatchset: boolean;
repo: string;
hasRepo: boolean;
revision: string;
hasRevision: boolean;
status: JobStatus;
hasStatus: boolean;
timeStart?: string;
hasTimeStart: boolean;
timeEnd?: string;
hasTimeEnd: boolean;
}
interface SearchJobsRequestJSON {
buildbucket_build_id?: string;
has_buildbucket_build_id?: boolean;
is_force?: boolean;
has_is_force?: boolean;
issue?: string;
has_issue?: boolean;
name?: string;
has_name?: boolean;
patchset?: string;
has_patchset?: boolean;
repo?: string;
has_repo?: boolean;
revision?: string;
has_revision?: boolean;
status?: string;
has_status?: boolean;
time_start?: string;
has_time_start?: boolean;
time_end?: string;
has_time_end?: boolean;
}
const SearchJobsRequestToJSON = (m: SearchJobsRequest): SearchJobsRequestJSON => {
return {
buildbucket_build_id: m.buildbucketBuildId,
has_buildbucket_build_id: m.hasBuildbucketBuildId,
is_force: m.isForce,
has_is_force: m.hasIsForce,
issue: m.issue,
has_issue: m.hasIssue,
name: m.name,
has_name: m.hasName,
patchset: m.patchset,
has_patchset: m.hasPatchset,
repo: m.repo,
has_repo: m.hasRepo,
revision: m.revision,
has_revision: m.hasRevision,
status: m.status,
has_status: m.hasStatus,
time_start: m.timeStart,
has_time_start: m.hasTimeStart,
time_end: m.timeEnd,
has_time_end: m.hasTimeEnd,
};
};
export interface SearchJobsResponse {
jobs?: Job[];
}
interface SearchJobsResponseJSON {
jobs?: JobJSON[];
}
const JSONToSearchJobsResponse = (m: SearchJobsResponseJSON): SearchJobsResponse => {
return {
jobs: m.jobs && m.jobs.map(JSONToJob),
};
};
export interface GetTaskRequest {
id: string;
includeStats: boolean;
}
interface GetTaskRequestJSON {
id?: string;
include_stats?: boolean;
}
const GetTaskRequestToJSON = (m: GetTaskRequest): GetTaskRequestJSON => {
return {
id: m.id,
include_stats: m.includeStats,
};
};
export interface GetTaskResponse {
task?: Task;
}
interface GetTaskResponseJSON {
task?: TaskJSON;
}
const JSONToGetTaskResponse = (m: GetTaskResponseJSON): GetTaskResponse => {
return {
task: m.task && JSONToTask(m.task),
};
};
export interface SearchTasksRequest {
attempt: number;
hasAttempt: boolean;
issue: string;
hasIssue: boolean;
name: string;
hasName: boolean;
patchset: string;
hasPatchset: boolean;
repo: string;
hasRepo: boolean;
revision: string;
hasRevision: boolean;
status: TaskStatus;
hasStatus: boolean;
timeStart?: string;
hasTimeStart: boolean;
timeEnd?: string;
hasTimeEnd: boolean;
}
interface SearchTasksRequestJSON {
attempt?: number;
has_attempt?: boolean;
issue?: string;
has_issue?: boolean;
name?: string;
has_name?: boolean;
patchset?: string;
has_patchset?: boolean;
repo?: string;
has_repo?: boolean;
revision?: string;
has_revision?: boolean;
status?: string;
has_status?: boolean;
time_start?: string;
has_time_start?: boolean;
time_end?: string;
has_time_end?: boolean;
}
const SearchTasksRequestToJSON = (m: SearchTasksRequest): SearchTasksRequestJSON => {
return {
attempt: m.attempt,
has_attempt: m.hasAttempt,
issue: m.issue,
has_issue: m.hasIssue,
name: m.name,
has_name: m.hasName,
patchset: m.patchset,
has_patchset: m.hasPatchset,
repo: m.repo,
has_repo: m.hasRepo,
revision: m.revision,
has_revision: m.hasRevision,
status: m.status,
has_status: m.hasStatus,
time_start: m.timeStart,
has_time_start: m.hasTimeStart,
time_end: m.timeEnd,
has_time_end: m.hasTimeEnd,
};
};
export interface SearchTasksResponse {
tasks?: Task[];
}
interface SearchTasksResponseJSON {
tasks?: TaskJSON[];
}
const JSONToSearchTasksResponse = (m: SearchTasksResponseJSON): SearchTasksResponse => {
return {
tasks: m.tasks && m.tasks.map(JSONToTask),
};
};
export interface GetSkipTaskRulesRequest {
}
interface GetSkipTaskRulesRequestJSON {
}
const GetSkipTaskRulesRequestToJSON = (m: GetSkipTaskRulesRequest): GetSkipTaskRulesRequestJSON => {
return {
};
};
export interface SkipTaskRule {
addedBy: string;
taskSpecPatterns?: string[];
commits?: string[];
description: string;
name: string;
}
interface SkipTaskRuleJSON {
added_by?: string;
task_spec_patterns?: string[];
commits?: string[];
description?: string;
name?: string;
}
const JSONToSkipTaskRule = (m: SkipTaskRuleJSON): SkipTaskRule => {
return {
addedBy: m.added_by || "",
taskSpecPatterns: m.task_spec_patterns,
commits: m.commits,
description: m.description || "",
name: m.name || "",
};
};
export interface GetSkipTaskRulesResponse {
rules?: SkipTaskRule[];
}
interface GetSkipTaskRulesResponseJSON {
rules?: SkipTaskRuleJSON[];
}
const JSONToGetSkipTaskRulesResponse = (m: GetSkipTaskRulesResponseJSON): GetSkipTaskRulesResponse => {
return {
rules: m.rules && m.rules.map(JSONToSkipTaskRule),
};
};
export interface AddSkipTaskRuleRequest {
taskSpecPatterns?: string[];
commits?: string[];
description: string;
name: string;
}
interface AddSkipTaskRuleRequestJSON {
task_spec_patterns?: string[];
commits?: string[];
description?: string;
name?: string;
}
const AddSkipTaskRuleRequestToJSON = (m: AddSkipTaskRuleRequest): AddSkipTaskRuleRequestJSON => {
return {
task_spec_patterns: m.taskSpecPatterns,
commits: m.commits,
description: m.description,
name: m.name,
};
};
export interface AddSkipTaskRuleResponse {
rules?: SkipTaskRule[];
}
interface AddSkipTaskRuleResponseJSON {
rules?: SkipTaskRuleJSON[];
}
const JSONToAddSkipTaskRuleResponse = (m: AddSkipTaskRuleResponseJSON): AddSkipTaskRuleResponse => {
return {
rules: m.rules && m.rules.map(JSONToSkipTaskRule),
};
};
export interface DeleteSkipTaskRuleRequest {
id: string;
}
interface DeleteSkipTaskRuleRequestJSON {
id?: string;
}
const DeleteSkipTaskRuleRequestToJSON = (m: DeleteSkipTaskRuleRequest): DeleteSkipTaskRuleRequestJSON => {
return {
id: m.id,
};
};
export interface DeleteSkipTaskRuleResponse {
rules?: SkipTaskRule[];
}
interface DeleteSkipTaskRuleResponseJSON {
rules?: SkipTaskRuleJSON[];
}
const JSONToDeleteSkipTaskRuleResponse = (m: DeleteSkipTaskRuleResponseJSON): DeleteSkipTaskRuleResponse => {
return {
rules: m.rules && m.rules.map(JSONToSkipTaskRule),
};
};
export interface RepoState_Patch {
issue: string;
patchRepo: string;
patchset: string;
server: string;
}
interface RepoState_PatchJSON {
issue?: string;
patch_repo?: string;
patchset?: string;
server?: string;
}
const JSONToRepoState_Patch = (m: RepoState_PatchJSON): RepoState_Patch => {
return {
issue: m.issue || "",
patchRepo: m.patch_repo || "",
patchset: m.patchset || "",
server: m.server || "",
};
};
export interface RepoState {
patch?: RepoState_Patch;
repo: string;
revision: string;
}
interface RepoStateJSON {
patch?: RepoState_PatchJSON;
repo?: string;
revision?: string;
}
const JSONToRepoState = (m: RepoStateJSON): RepoState => {
return {
patch: m.patch && JSONToRepoState_Patch(m.patch),
repo: m.repo || "",
revision: m.revision || "",
};
};
export interface TaskKey {
repoState?: RepoState;
name: string;
forcedJobId: string;
}
interface TaskKeyJSON {
repo_state?: RepoStateJSON;
name?: string;
forced_job_id?: string;
}
const JSONToTaskKey = (m: TaskKeyJSON): TaskKey => {
return {
repoState: m.repo_state && JSONToRepoState(m.repo_state),
name: m.name || "",
forcedJobId: m.forced_job_id || "",
};
};
export interface Task_PropertiesEntry {
[key: string]: string;
}
interface Task_PropertiesEntryJSON {
[key: string]: string;
}
export interface Task {
attempt: number;
commits?: string[];
createdAt?: string;
dbModifiedAt?: string;
finishedAt?: string;
id: string;
isolatedOutput: string;
jobs?: string[];
maxAttempts: number;
parentTaskIds?: string[];
properties?: Task_PropertiesEntry;
retryOf: string;
startedAt?: string;
status: TaskStatus;
swarmingBotId: string;
swarmingTaskId: string;
taskKey?: TaskKey;
stats?: TaskStats;
}
interface TaskJSON {
attempt?: number;
commits?: string[];
created_at?: string;
db_modified_at?: string;
finished_at?: string;
id?: string;
isolated_output?: string;
jobs?: string[];
max_attempts?: number;
parent_task_ids?: string[];
properties?: Task_PropertiesEntryJSON;
retry_of?: string;
started_at?: string;
status?: string;
swarming_bot_id?: string;
swarming_task_id?: string;
task_key?: TaskKeyJSON;
stats?: TaskStatsJSON;
}
const JSONToTask = (m: TaskJSON): Task => {
return {
attempt: m.attempt || 0,
commits: m.commits,
createdAt: m.created_at,
dbModifiedAt: m.db_modified_at,
finishedAt: m.finished_at,
id: m.id || "",
isolatedOutput: m.isolated_output || "",
jobs: m.jobs,
maxAttempts: m.max_attempts || 0,
parentTaskIds: m.parent_task_ids,
properties: m.properties,
retryOf: m.retry_of || "",
startedAt: m.started_at,
status: (m.status || Object.keys(TaskStatus)[0]) as TaskStatus,
swarmingBotId: m.swarming_bot_id || "",
swarmingTaskId: m.swarming_task_id || "",
taskKey: m.task_key && JSONToTaskKey(m.task_key),
stats: m.stats && JSONToTaskStats(m.stats),
};
};
export interface TaskDependencies {
task: string;
dependencies?: string[];
}
interface TaskDependenciesJSON {
task?: string;
dependencies?: string[];
}
const JSONToTaskDependencies = (m: TaskDependenciesJSON): TaskDependencies => {
return {
task: m.task || "",
dependencies: m.dependencies,
};
};
export interface TaskSummary {
id: string;
attempt: number;
maxAttempts: number;
status: TaskStatus;
swarmingTaskId: string;
}
interface TaskSummaryJSON {
id?: string;
attempt?: number;
max_attempts?: number;
status?: string;
swarming_task_id?: string;
}
const JSONToTaskSummary = (m: TaskSummaryJSON): TaskSummary => {
return {
id: m.id || "",
attempt: m.attempt || 0,
maxAttempts: m.max_attempts || 0,
status: (m.status || Object.keys(TaskStatus)[0]) as TaskStatus,
swarmingTaskId: m.swarming_task_id || "",
};
};
export interface TaskSummaries {
name: string;
tasks?: TaskSummary[];
}
interface TaskSummariesJSON {
name?: string;
tasks?: TaskSummaryJSON[];
}
const JSONToTaskSummaries = (m: TaskSummariesJSON): TaskSummaries => {
return {
name: m.name || "",
tasks: m.tasks && m.tasks.map(JSONToTaskSummary),
};
};
export interface TaskDimensions {
taskName: string;
dimensions?: string[];
}
interface TaskDimensionsJSON {
task_name?: string;
dimensions?: string[];
}
const JSONToTaskDimensions = (m: TaskDimensionsJSON): TaskDimensions => {
return {
taskName: m.task_name || "",
dimensions: m.dimensions,
};
};
export interface TaskStats {
totalOverheadS: string;
downloadOverheadS: string;
uploadOverheadS: string;
}
interface TaskStatsJSON {
total_overhead_s?: string;
download_overhead_s?: string;
upload_overhead_s?: string;
}
const JSONToTaskStats = (m: TaskStatsJSON): TaskStats => {
return {
totalOverheadS: m.total_overhead_s || "",
downloadOverheadS: m.download_overhead_s || "",
uploadOverheadS: m.upload_overhead_s || "",
};
};
export interface Job {
buildbucketBuildId: string;
buildbucketLeaseKey: string;
createdAt?: string;
dbModifiedAt?: string;
dependencies?: TaskDependencies[];
finishedAt?: string;
id: string;
isForce: boolean;
name: string;
priority: string;
repoState?: RepoState;
requestedAt?: string;
status: JobStatus;
tasks?: TaskSummaries[];
taskDimensions?: TaskDimensions[];
}
interface JobJSON {
buildbucket_build_id?: string;
buildbucket_lease_key?: string;
created_at?: string;
db_modified_at?: string;
dependencies?: TaskDependenciesJSON[];
finished_at?: string;
id?: string;
is_force?: boolean;
name?: string;
priority?: string;
repo_state?: RepoStateJSON;
requested_at?: string;
status?: string;
tasks?: TaskSummariesJSON[];
task_dimensions?: TaskDimensionsJSON[];
}
const JSONToJob = (m: JobJSON): Job => {
return {
buildbucketBuildId: m.buildbucket_build_id || "",
buildbucketLeaseKey: m.buildbucket_lease_key || "",
createdAt: m.created_at,
dbModifiedAt: m.db_modified_at,
dependencies: m.dependencies && m.dependencies.map(JSONToTaskDependencies),
finishedAt: m.finished_at,
id: m.id || "",
isForce: m.is_force || false,
name: m.name || "",
priority: m.priority || "",
repoState: m.repo_state && JSONToRepoState(m.repo_state),
requestedAt: m.requested_at,
status: (m.status || Object.keys(JobStatus)[0]) as JobStatus,
tasks: m.tasks && m.tasks.map(JSONToTaskSummaries),
taskDimensions: m.task_dimensions && m.task_dimensions.map(JSONToTaskDimensions),
};
};
export interface TaskSchedulerService {
triggerJobs: (triggerJobsRequest: TriggerJobsRequest) => Promise<TriggerJobsResponse>;
getJob: (getJobRequest: GetJobRequest) => Promise<GetJobResponse>;
cancelJob: (cancelJobRequest: CancelJobRequest) => Promise<CancelJobResponse>;
searchJobs: (searchJobsRequest: SearchJobsRequest) => Promise<SearchJobsResponse>;
getTask: (getTaskRequest: GetTaskRequest) => Promise<GetTaskResponse>;
searchTasks: (searchTasksRequest: SearchTasksRequest) => Promise<SearchTasksResponse>;
getSkipTaskRules: (getSkipTaskRulesRequest: GetSkipTaskRulesRequest) => Promise<GetSkipTaskRulesResponse>;
addSkipTaskRule: (addSkipTaskRuleRequest: AddSkipTaskRuleRequest) => Promise<AddSkipTaskRuleResponse>;
deleteSkipTaskRule: (deleteSkipTaskRuleRequest: DeleteSkipTaskRuleRequest) => Promise<DeleteSkipTaskRuleResponse>;
}
export class TaskSchedulerServiceClient implements TaskSchedulerService {
private hostname: string;
private fetch: Fetch;
private writeCamelCase: boolean;
private pathPrefix = "/twirp/task_scheduler.rpc.TaskSchedulerService/";
private optionsOverride: object;
constructor(hostname: string, fetch: Fetch, writeCamelCase = false, optionsOverride: any = {}) {
this.hostname = hostname;
this.fetch = fetch;
this.writeCamelCase = writeCamelCase;
this.optionsOverride = optionsOverride;
}
triggerJobs(triggerJobsRequest: TriggerJobsRequest): Promise<TriggerJobsResponse> {
const url = this.hostname + this.pathPrefix + "TriggerJobs";
let body: TriggerJobsRequest | TriggerJobsRequestJSON = triggerJobsRequest;
if (!this.writeCamelCase) {
body = TriggerJobsRequestToJSON(triggerJobsRequest);
}
return this.fetch(createTwirpRequest(url, body, this.optionsOverride)).then((resp) => {
if (!resp.ok) {
return throwTwirpError(resp);
}
return resp.json().then(JSONToTriggerJobsResponse);
});
}
getJob(getJobRequest: GetJobRequest): Promise<GetJobResponse> {
const url = this.hostname + this.pathPrefix + "GetJob";
let body: GetJobRequest | GetJobRequestJSON = getJobRequest;
if (!this.writeCamelCase) {
body = GetJobRequestToJSON(getJobRequest);
}
return this.fetch(createTwirpRequest(url, body, this.optionsOverride)).then((resp) => {
if (!resp.ok) {
return throwTwirpError(resp);
}
return resp.json().then(JSONToGetJobResponse);
});
}
cancelJob(cancelJobRequest: CancelJobRequest): Promise<CancelJobResponse> {
const url = this.hostname + this.pathPrefix + "CancelJob";
let body: CancelJobRequest | CancelJobRequestJSON = cancelJobRequest;
if (!this.writeCamelCase) {
body = CancelJobRequestToJSON(cancelJobRequest);
}
return this.fetch(createTwirpRequest(url, body, this.optionsOverride)).then((resp) => {
if (!resp.ok) {
return throwTwirpError(resp);
}
return resp.json().then(JSONToCancelJobResponse);
});
}
searchJobs(searchJobsRequest: SearchJobsRequest): Promise<SearchJobsResponse> {
const url = this.hostname + this.pathPrefix + "SearchJobs";
let body: SearchJobsRequest | SearchJobsRequestJSON = searchJobsRequest;
if (!this.writeCamelCase) {
body = SearchJobsRequestToJSON(searchJobsRequest);
}
return this.fetch(createTwirpRequest(url, body, this.optionsOverride)).then((resp) => {
if (!resp.ok) {
return throwTwirpError(resp);
}
return resp.json().then(JSONToSearchJobsResponse);
});
}
getTask(getTaskRequest: GetTaskRequest): Promise<GetTaskResponse> {
const url = this.hostname + this.pathPrefix + "GetTask";
let body: GetTaskRequest | GetTaskRequestJSON = getTaskRequest;
if (!this.writeCamelCase) {
body = GetTaskRequestToJSON(getTaskRequest);
}
return this.fetch(createTwirpRequest(url, body, this.optionsOverride)).then((resp) => {
if (!resp.ok) {
return throwTwirpError(resp);
}
return resp.json().then(JSONToGetTaskResponse);
});
}
searchTasks(searchTasksRequest: SearchTasksRequest): Promise<SearchTasksResponse> {
const url = this.hostname + this.pathPrefix + "SearchTasks";
let body: SearchTasksRequest | SearchTasksRequestJSON = searchTasksRequest;
if (!this.writeCamelCase) {
body = SearchTasksRequestToJSON(searchTasksRequest);
}
return this.fetch(createTwirpRequest(url, body, this.optionsOverride)).then((resp) => {
if (!resp.ok) {
return throwTwirpError(resp);
}
return resp.json().then(JSONToSearchTasksResponse);
});
}
getSkipTaskRules(getSkipTaskRulesRequest: GetSkipTaskRulesRequest): Promise<GetSkipTaskRulesResponse> {
const url = this.hostname + this.pathPrefix + "GetSkipTaskRules";
let body: GetSkipTaskRulesRequest | GetSkipTaskRulesRequestJSON = getSkipTaskRulesRequest;
if (!this.writeCamelCase) {
body = GetSkipTaskRulesRequestToJSON(getSkipTaskRulesRequest);
}
return this.fetch(createTwirpRequest(url, body, this.optionsOverride)).then((resp) => {
if (!resp.ok) {
return throwTwirpError(resp);
}
return resp.json().then(JSONToGetSkipTaskRulesResponse);
});
}
addSkipTaskRule(addSkipTaskRuleRequest: AddSkipTaskRuleRequest): Promise<AddSkipTaskRuleResponse> {
const url = this.hostname + this.pathPrefix + "AddSkipTaskRule";
let body: AddSkipTaskRuleRequest | AddSkipTaskRuleRequestJSON = addSkipTaskRuleRequest;
if (!this.writeCamelCase) {
body = AddSkipTaskRuleRequestToJSON(addSkipTaskRuleRequest);
}
return this.fetch(createTwirpRequest(url, body, this.optionsOverride)).then((resp) => {
if (!resp.ok) {
return throwTwirpError(resp);
}
return resp.json().then(JSONToAddSkipTaskRuleResponse);
});
}
deleteSkipTaskRule(deleteSkipTaskRuleRequest: DeleteSkipTaskRuleRequest): Promise<DeleteSkipTaskRuleResponse> {
const url = this.hostname + this.pathPrefix + "DeleteSkipTaskRule";
let body: DeleteSkipTaskRuleRequest | DeleteSkipTaskRuleRequestJSON = deleteSkipTaskRuleRequest;
if (!this.writeCamelCase) {
body = DeleteSkipTaskRuleRequestToJSON(deleteSkipTaskRuleRequest);
}
return this.fetch(createTwirpRequest(url, body, this.optionsOverride)).then((resp) => {
if (!resp.ok) {
return throwTwirpError(resp);
}
return resp.json().then(JSONToDeleteSkipTaskRuleResponse);
});
}
}