in sdk/servicebus/service-bus/src/core/managementClient.ts [1308:1438]
async getRules(
options?: ListRequestOptions & OperationOptionsBase & SendManagementRequestOptions,
): Promise<RuleProperties[]> {
throwErrorIfConnectionClosed(this._context);
try {
const updatedOptions = (await this.initWithUniqueReplyTo(options)) as ListRequestOptions &
OperationOptionsBase &
SendManagementRequestOptions;
const request: RheaMessage = {
body: {
top: updatedOptions?.maxCount
? types.wrap_int(updatedOptions.maxCount)
: types.wrap_int(max32BitNumber),
skip: updatedOptions?.skip ? types.wrap_int(updatedOptions.skip) : types.wrap_int(0),
},
reply_to: this.replyTo,
application_properties: {
operation: Constants.operations.enumerateRules,
},
};
request.application_properties![Constants.trackingId] = generate_uuid();
managementClientLogger.verbose(
"%s Get rules request body: %O.",
this.logPrefix,
request.body,
);
const response = await this._makeManagementRequest(
request,
managementClientLogger,
updatedOptions,
);
if (
response.application_properties!.statusCode === 204 ||
!response.body ||
!Array.isArray(response.body.rules)
) {
return [];
}
// Reference: https://learn.microsoft.com/azure/service-bus-messaging/service-bus-amqp-request-response#response-11
const result: { "rule-description": Typed }[] = response.body.rules || [];
const rules: RuleProperties[] = [];
result.forEach((x) => {
const ruleDescriptor = x["rule-description"];
let filter: SqlRuleFilter | CorrelationRuleFilter;
// We use the first three elements of the `ruleDescriptor.value` to get filter, action, name
if (
!ruleDescriptor ||
!ruleDescriptor.descriptor ||
ruleDescriptor.descriptor.value !== Constants.descriptorCodes.ruleDescriptionList ||
!Array.isArray(ruleDescriptor.value) ||
ruleDescriptor.value.length < 3
) {
return;
}
const filtersRawData: Typed = ruleDescriptor.value[0];
const actionsRawData: Typed = ruleDescriptor.value[1];
let sqlRuleAction: SqlRuleAction;
if (
actionsRawData.descriptor.value === Constants.descriptorCodes.sqlRuleActionList &&
Array.isArray(actionsRawData.value) &&
actionsRawData.value.length
) {
sqlRuleAction = {
sqlExpression: this._safelyGetTypedValueFromArray(actionsRawData.value, 0),
};
} else {
sqlRuleAction = {};
}
switch (filtersRawData.descriptor.value) {
case Constants.descriptorCodes.trueFilterList:
filter = {
sqlExpression: "1=1",
};
break;
case Constants.descriptorCodes.falseFilterList:
filter = {
sqlExpression: "1=0",
};
break;
case Constants.descriptorCodes.sqlFilterList:
filter = {
sqlExpression: this._safelyGetTypedValueFromArray(filtersRawData.value, 0),
};
break;
case Constants.descriptorCodes.correlationFilterList:
filter = {
correlationId: this._safelyGetTypedValueFromArray(filtersRawData.value, 0),
messageId: this._safelyGetTypedValueFromArray(filtersRawData.value, 1),
to: this._safelyGetTypedValueFromArray(filtersRawData.value, 2),
replyTo: this._safelyGetTypedValueFromArray(filtersRawData.value, 3),
subject: this._safelyGetTypedValueFromArray(filtersRawData.value, 4),
sessionId: this._safelyGetTypedValueFromArray(filtersRawData.value, 5),
replyToSessionId: this._safelyGetTypedValueFromArray(filtersRawData.value, 6),
contentType: this._safelyGetTypedValueFromArray(filtersRawData.value, 7),
applicationProperties:
Array.isArray(filtersRawData.value) &&
filtersRawData.value.length > 8 &&
filtersRawData.value[8]
? this._decodeApplicationPropertiesMap(filtersRawData.value[8])
: undefined,
};
break;
default:
throw new Error(
`${this.logPrefix} Found unexpected descriptor code for the filter: ${filtersRawData.descriptor.value}`,
);
}
const rule: RuleProperties = {
name: ruleDescriptor.value[2].value,
filter,
action: sqlRuleAction,
};
rules.push(rule);
});
return rules;
} catch (err: any) {
const error = translateServiceBusError(err);
managementClientLogger.logError(
error,
`${this.logPrefix} An error occurred while sending the get rules request to $management endpoint`,
);
throw error;
}
}