async getRules()

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;
    }
  }