diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 249819fff..c3b941a89 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -30,7 +30,7 @@ repos: - id: cargo-test name: cargo-nextest description: "Run 'cargo nextest' and doc tests" - entry: cargo nextest run + entry: cargo t language: system types: [rust] require_serial: true diff --git a/api/oas_generator/rust_oas_generator/parser/oas_parser.py b/api/oas_generator/rust_oas_generator/parser/oas_parser.py index 718f6cba0..506331dc6 100644 --- a/api/oas_generator/rust_oas_generator/parser/oas_parser.py +++ b/api/oas_generator/rust_oas_generator/parser/oas_parser.py @@ -359,6 +359,9 @@ class Operation: request_body_supports_msgpack: bool = False request_body_supports_text_plain: bool = False has_optional_string: bool = False + # When the original spec had a query param `format` with enum ['msgpack'] only, + # we don't expose it to callers but still need to set it implicitly on requests + force_msgpack_query: bool = False def __post_init__(self) -> None: for param in self.parameters: @@ -706,6 +709,19 @@ def _parse_operation( operation_data, ) + # Detect if the original spec constrained `format` to only msgpack + force_msgpack_query = False + for p in operation_data.get("parameters", []) or []: + p_obj = self._resolve_reference(p["$ref"]) if isinstance(p, dict) and "$ref" in p else p + if not isinstance(p_obj, dict): + continue + if p_obj.get("in", "query") == "query" and p_obj.get("name") == "format": + schema_obj = p_obj.get("schema", {}) or {} + enum_vals = schema_obj.get("enum") + if isinstance(enum_vals, list) and len(enum_vals) == 1 and enum_vals[0] == "msgpack": + force_msgpack_query = True + break + parameters = [] for param_data in operation_data.get("parameters", []): param = self._parse_parameter(param_data) @@ -730,6 +746,7 @@ def _parse_operation( supports_msgpack=supports_msgpack, request_body_supports_msgpack=request_body_supports_msgpack, request_body_supports_text_plain=request_body_supports_text_plain, + force_msgpack_query=force_msgpack_query, ) def _check_request_body_msgpack_support( @@ -770,13 +787,21 @@ def _parse_parameter(self, param_data: dict[str, Any]) -> Parameter | None: if not name: return None + # Skip `format` query parameter when constrained to msgpack only + in_location = param_data.get("in", "query") + if name == "format" and in_location == "query": + schema_obj = param_data.get("schema", {}) or {} + enum_vals = schema_obj.get("enum") + if isinstance(enum_vals, list) and len(enum_vals) == 1 and enum_vals[0] == "msgpack": + return None + schema = param_data.get("schema", {}) rust_type = rust_type_from_openapi(schema, self.schemas, set()) enum_values = schema.get("enum", []) if schema.get("type") == "string" else [] return Parameter( name=name, - param_type=param_data.get("in", "query"), + param_type=in_location, rust_type=rust_type, required=param_data.get("required", False), description=param_data.get("description"), diff --git a/api/oas_generator/rust_oas_generator/templates/apis/endpoint.rs.j2 b/api/oas_generator/rust_oas_generator/templates/apis/endpoint.rs.j2 index 38e272ad8..7869180b5 100644 --- a/api/oas_generator/rust_oas_generator/templates/apis/endpoint.rs.j2 +++ b/api/oas_generator/rust_oas_generator/templates/apis/endpoint.rs.j2 @@ -93,7 +93,7 @@ pub async fn {{ operation.rust_function_name }}( let path = "{{ rust_path }}".to_string(); {% endif %} - let{% if get_query_parameters(operation) %} mut{% endif %} query_params: HashMap = HashMap::new(); + let{% if get_query_parameters(operation) or operation.force_msgpack_query %} mut{% endif %} query_params: HashMap = HashMap::new(); {% for param in get_query_parameters(operation) %} {% if param.required %} {% if param.is_array %} @@ -111,6 +111,9 @@ pub async fn {{ operation.rust_function_name }}( } {% endif %} {% endfor %} + {% if operation.force_msgpack_query %} + query_params.insert("format".to_string(), "msgpack".to_string()); + {% endif %} {% if operation.request_body_supports_text_plain %} let mut headers: HashMap = HashMap::new(); diff --git a/api/oas_generator/ts_oas_generator/generator/models.py b/api/oas_generator/ts_oas_generator/generator/models.py index 4f22a4b1e..7f73cc5c9 100644 --- a/api/oas_generator/ts_oas_generator/generator/models.py +++ b/api/oas_generator/ts_oas_generator/generator/models.py @@ -50,6 +50,9 @@ class OperationContext: returns_msgpack: bool = False has_format_param: bool = False format_var_name: str | None = None + # When the original spec had a query param `format` with enum ['msgpack'] only, + # we don't expose it to callers but still need to set it implicitly on requests + force_msgpack_query: bool = False error_types: list[ErrorDescriptor] | None = None def to_dict(self) -> dict[str, Any]: @@ -67,6 +70,7 @@ def to_dict(self) -> dict[str, Any]: "returnsMsgpack": self.returns_msgpack, "hasFormatParam": self.has_format_param, "formatVarName": self.format_var_name, + "forceMsgpackQuery": self.force_msgpack_query, "errorTypes": [self._error_to_dict(e) for e in (self.error_types or [])], } diff --git a/api/oas_generator/ts_oas_generator/generator/template_engine.py b/api/oas_generator/ts_oas_generator/generator/template_engine.py index 772fad338..ea5082c33 100644 --- a/api/oas_generator/ts_oas_generator/generator/template_engine.py +++ b/api/oas_generator/ts_oas_generator/generator/template_engine.py @@ -367,6 +367,7 @@ def _create_operation_context(self, op_input: OperationInput) -> OperationContex # Compute additional properties self._compute_format_param(context) + self._compute_force_msgpack_query(context, op_input.operation, op_input.spec) self._compute_import_types(context) return context @@ -384,6 +385,14 @@ def _process_parameters(self, params: list[Schema], spec: Schema) -> list[Parame # Extract parameter details raw_name = str(param.get("name")) + # Skip `format` query param when it's constrained to only msgpack + location_candidate = param.get(constants.OperationKey.IN, constants.ParamLocation.QUERY) + if location_candidate == constants.ParamLocation.QUERY and raw_name == constants.FORMAT_PARAM_NAME: + schema_obj = param.get("schema", {}) or {} + enum_vals = schema_obj.get(constants.SchemaKey.ENUM) + if isinstance(enum_vals, list) and len(enum_vals) == 1 and enum_vals[0] == "msgpack": + # Endpoint only supports msgpack; do not expose/append `format` + continue var_name = self._sanitize_variable_name(ts_camel_case(raw_name), used_names) used_names.add(var_name) @@ -397,7 +406,7 @@ def _process_parameters(self, params: list[Schema], spec: Schema) -> list[Parame else: stringify_bigint = constants.TypeScriptType.BIGINT in ts_type_str - location = param.get(constants.OperationKey.IN, constants.ParamLocation.QUERY) + location = location_candidate required = param.get(constants.SchemaKey.REQUIRED, False) or location == constants.ParamLocation.PATH parameters.append( @@ -501,6 +510,24 @@ def _compute_format_param(self, context: OperationContext) -> None: context.format_var_name = param.var_name break + def _compute_force_msgpack_query(self, context: OperationContext, raw_operation: Schema, spec: Schema) -> None: + """Detect if the raw spec constrains query format to only 'msgpack' and mark for implicit query injection.""" + params = raw_operation.get(constants.OperationKey.PARAMETERS, []) or [] + for param_def in params: + param = ( + self._resolve_ref(param_def, spec) if isinstance(param_def, dict) and "$ref" in param_def else param_def + ) + if not isinstance(param, dict): + continue + name = param.get("name") + location = param.get(constants.OperationKey.IN, constants.ParamLocation.QUERY) + if location == constants.ParamLocation.QUERY and name == constants.FORMAT_PARAM_NAME: + schema_obj = param.get("schema", {}) or {} + enum_vals = schema_obj.get(constants.SchemaKey.ENUM) + if isinstance(enum_vals, list) and len(enum_vals) == 1 and enum_vals[0] == "msgpack": + context.force_msgpack_query = True + return + def _compute_import_types(self, context: OperationContext) -> None: """Collect model types that need importing.""" builtin_types = constants.TS_BUILTIN_TYPES diff --git a/api/oas_generator/ts_oas_generator/templates/apis/service.ts.j2 b/api/oas_generator/ts_oas_generator/templates/apis/service.ts.j2 index bb75ce132..027aa9b5e 100644 --- a/api/oas_generator/ts_oas_generator/templates/apis/service.ts.j2 +++ b/api/oas_generator/ts_oas_generator/templates/apis/service.ts.j2 @@ -1,5 +1,6 @@ import type { BaseHttpRequest, ApiRequestOptions } from '../core/base-http-request'; import { AlgorandSerializer } from '../core/model-runtime'; +import type { BodyFormat } from '../core/model-runtime'; {% if import_types and import_types|length > 0 %} {% set sorted = import_types | sort %} import type { {{ sorted | join(', ') }} } from '../models/index'; @@ -8,13 +9,13 @@ import { {% for t in sorted %}{{ t }}Meta{% if not loop.last %}, {% endif %}{% e {% macro field_type_meta(type_name) -%} {%- if type_name in import_types -%} -{ kind: 'model', meta: () => {{ type_name }}Meta } +({ kind: 'model', meta: () => {{ type_name }}Meta } as const) {%- elif type_name == 'SignedTransaction' -%} -{ kind: 'codec', codecKey: 'SignedTransaction' } +({ kind: 'codec', codecKey: 'SignedTransaction' } as const) {%- elif type_name == 'Uint8Array' -%} -{ kind: 'scalar', isBytes: true } +({ kind: 'scalar', isBytes: true } as const) {%- elif type_name == 'bigint' -%} -{ kind: 'scalar', isBigint: true } +({ kind: 'scalar', isBigint: true } as const) {%- else -%} null {%- endif -%} @@ -33,10 +34,10 @@ null null {%- else -%} {%- set item = field_type_meta(base) -%} - {%- if item == 'null' -%} +{%- if item == 'null' -%} null {%- else -%} -({ name: '{{ base }}[]', kind: 'array', arrayItems: {{ item }} }) +({ name: '{{ base }}[]', kind: 'array', arrayItems: {{ item }} } as const) {%- endif -%} {%- endif -%} {%- endmacro %} @@ -49,11 +50,11 @@ null {%- if t in import_types -%} {{ t }}Meta {%- elif t == 'SignedTransaction' -%} -({ name: 'SignedTransaction', kind: 'passthrough', codecKey: 'SignedTransaction' }) +({ name: 'SignedTransaction', kind: 'passthrough', codecKey: 'SignedTransaction' } as const) {%- elif t == 'Uint8Array' -%} -({ name: 'Uint8Array', kind: 'passthrough', passThrough: { kind: 'scalar', isBytes: true } }) +({ name: 'Uint8Array', kind: 'passthrough', passThrough: { kind: 'scalar', isBytes: true } as const } as const) {%- elif t == 'bigint' -%} -({ name: 'bigint', kind: 'passthrough', passThrough: { kind: 'scalar', isBigint: true } }) +({ name: 'bigint', kind: 'passthrough', passThrough: { kind: 'scalar', isBigint: true } as const } as const) {%- else -%} null {%- endif -%} @@ -72,6 +73,14 @@ undefined export class {{ service_class_name }} { constructor(public readonly httpRequest: BaseHttpRequest) {} + private static acceptFor(format: BodyFormat): string { + return format === 'json' ? 'application/json' : 'application/msgpack'; + } + + private static mediaFor(format: BodyFormat): string { + return format === 'json' ? 'application/json' : 'application/msgpack'; + } + {% for op in operations %} {% set is_raw_bytes_body = op.requestBody and op.requestBody.tsType == 'Uint8Array' %} {{ op.description | ts_doc_comment }} @@ -93,8 +102,8 @@ export class {{ service_class_name }} { ): Promise<{{ op.responseTsType }}> { const headers: Record = {}; {% set supports_msgpack = op.returnsMsgpack or (op.requestBody and op.requestBody.supportsMsgpack) %} - const responseFormat: 'json' | 'msgpack' = {% if supports_msgpack %}{% if op.hasFormatParam and op.formatVarName %}(params?.{{ op.formatVarName }} as 'json' | 'msgpack' | undefined) ?? 'msgpack'{% else %}'msgpack'{% endif %}{% else %}'json'{% endif %}; - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack'; + const responseFormat: BodyFormat = {% if supports_msgpack %}{% if op.hasFormatParam and op.formatVarName %}(params?.{{ op.formatVarName }} as BodyFormat | undefined) ?? 'msgpack'{% else %}'msgpack'{% endif %}{% else %}'json'{% endif %}; + headers['Accept'] = {{ service_class_name }}.acceptFor(responseFormat); {% if op.requestBody and op.method.upper() not in ['GET', 'HEAD', 'DELETE'] %} {% if is_raw_bytes_body %} @@ -103,7 +112,7 @@ export class {{ service_class_name }} { headers['Content-Type'] = mediaType; {% else %} const bodyMeta = {{ meta_expr(op.requestBody.tsType) }}; - const mediaType = bodyMeta ? (responseFormat === 'json' ? 'application/json' : 'application/msgpack') : undefined; + const mediaType = bodyMeta ? {{ service_class_name }}.mediaFor(responseFormat) : undefined; if (mediaType) headers['Content-Type'] = mediaType; const serializedBody = bodyMeta && params?.body !== undefined ? AlgorandSerializer.encode(params.body, bodyMeta, responseFormat) @@ -131,6 +140,9 @@ export class {{ service_class_name }} { {%- for p in query_params %} '{{ p.name }}': {% if p.stringifyBigInt %}(typeof params?.{{ p.varName }} === 'bigint' ? (params!.{{ p.varName }} as bigint).toString() : params?.{{ p.varName }}){% else %}params?.{{ p.varName }}{% endif %}, {%- endfor %} +{%- if op.forceMsgpackQuery %} + 'format': 'msgpack', +{%- endif %} }, headers, {% if op.requestBody and op.method.upper() not in ['GET', 'HEAD', 'DELETE'] %} diff --git a/api/oas_generator/ts_oas_generator/templates/base/src/core/request.ts.j2 b/api/oas_generator/ts_oas_generator/templates/base/src/core/request.ts.j2 index af6a1f142..63e8c74b4 100644 --- a/api/oas_generator/ts_oas_generator/templates/base/src/core/request.ts.j2 +++ b/api/oas_generator/ts_oas_generator/templates/base/src/core/request.ts.j2 @@ -61,23 +61,25 @@ export async function request(config: ClientConfig, options: { headers['Authorization'] = `Basic ${btoa(`${config.username}:${config.password}`)}`; } - let body: BodyValue | undefined = undefined; + let bodyPayload: BodyInit | undefined = undefined; if (options.body != null) { - if (options.body instanceof Uint8Array || typeof options.body === 'string') { - body = options.body; + if (options.body instanceof Uint8Array) { + bodyPayload = options.body; + } else if (typeof options.body === 'string') { + bodyPayload = options.body; } else if (options.mediaType?.includes('msgpack')) { - body = encodeMsgPack(options.body); + bodyPayload = encodeMsgPack(options.body); } else if (options.mediaType?.includes('json')) { - body = JSON.stringify(options.body); + bodyPayload = JSON.stringify(options.body); } else { - body = options.body; + bodyPayload = JSON.stringify(options.body); } } const response = await fetch(url.toString(), { method: options.method, headers, - body, + body: bodyPayload, credentials: config.credentials, }); diff --git a/crates/algod_client/src/apis/client.rs b/crates/algod_client/src/apis/client.rs index 60a532af0..e4c08d1a2 100644 --- a/crates/algod_client/src/apis/client.rs +++ b/crates/algod_client/src/apis/client.rs @@ -205,14 +205,12 @@ impl AlgodClient { &self, address: &str, max: Option, - format: Option, ) -> Result { let result = super::get_pending_transactions_by_address::get_pending_transactions_by_address( self.http_client.as_ref(), address, max, - format, ) .await; @@ -224,11 +222,9 @@ impl AlgodClient { &self, round: u64, header_only: Option, - format: Option, ) -> Result { let result = - super::get_block::get_block(self.http_client.as_ref(), round, header_only, format) - .await; + super::get_block::get_block(self.http_client.as_ref(), round, header_only).await; result } @@ -440,12 +436,10 @@ impl AlgodClient { pub async fn get_pending_transactions( &self, max: Option, - format: Option, ) -> Result { let result = super::get_pending_transactions::get_pending_transactions( self.http_client.as_ref(), max, - format, ) .await; @@ -456,12 +450,10 @@ impl AlgodClient { pub async fn pending_transaction_information( &self, txid: &str, - format: Option, ) -> Result { let result = super::pending_transaction_information::pending_transaction_information( self.http_client.as_ref(), txid, - format, ) .await; @@ -469,17 +461,10 @@ impl AlgodClient { } /// Get a LedgerStateDelta object for a given round - pub async fn get_ledger_state_delta( - &self, - round: u64, - format: Option, - ) -> Result { - let result = super::get_ledger_state_delta::get_ledger_state_delta( - self.http_client.as_ref(), - round, - format, - ) - .await; + pub async fn get_ledger_state_delta(&self, round: u64) -> Result { + let result = + super::get_ledger_state_delta::get_ledger_state_delta(self.http_client.as_ref(), round) + .await; result } @@ -488,12 +473,10 @@ impl AlgodClient { pub async fn get_transaction_group_ledger_state_deltas_for_round( &self, round: u64, - format: Option, ) -> Result { let result = super::get_transaction_group_ledger_state_deltas_for_round::get_transaction_group_ledger_state_deltas_for_round( self.http_client.as_ref(), round, - format, ).await; result @@ -503,12 +486,10 @@ impl AlgodClient { pub async fn get_ledger_state_delta_for_transaction_group( &self, id: &str, - format: Option, ) -> Result { let result = super::get_ledger_state_delta_for_transaction_group::get_ledger_state_delta_for_transaction_group( self.http_client.as_ref(), id, - format, ).await; result diff --git a/crates/algod_client/src/apis/get_block.rs b/crates/algod_client/src/apis/get_block.rs index e5c95c49e..2c8bc54d0 100644 --- a/crates/algod_client/src/apis/get_block.rs +++ b/crates/algod_client/src/apis/get_block.rs @@ -12,7 +12,6 @@ use algokit_http_client::{HttpClient, HttpMethod}; use serde::{Deserialize, Serialize}; use std::collections::HashMap; -use super::parameter_enums::*; use super::{AlgodApiError, ContentType, Error}; use algokit_transact::AlgorandMsgpack; @@ -40,11 +39,9 @@ pub async fn get_block( http_client: &dyn HttpClient, round: u64, header_only: Option, - format: Option, ) -> Result { let p_round = round; let p_header_only = header_only; - let p_format = format; let path = format!("/v2/blocks/{round}", round = p_round); @@ -52,18 +49,10 @@ pub async fn get_block( if let Some(value) = p_header_only { query_params.insert("header-only".to_string(), value.to_string()); } - if let Some(value) = p_format { - query_params.insert("format".to_string(), value.to_string()); - } - - let use_msgpack = p_format.map(|f| f != Format::Json).unwrap_or(true); + query_params.insert("format".to_string(), "msgpack".to_string()); let mut headers: HashMap = HashMap::new(); - if use_msgpack { - headers.insert("Accept".to_string(), "application/msgpack".to_string()); - } else { - headers.insert("Accept".to_string(), "application/json".to_string()); - } + headers.insert("Accept".to_string(), "application/msgpack".to_string()); let body = None; diff --git a/crates/algod_client/src/apis/get_ledger_state_delta.rs b/crates/algod_client/src/apis/get_ledger_state_delta.rs index 1859f5711..ff4afeb31 100644 --- a/crates/algod_client/src/apis/get_ledger_state_delta.rs +++ b/crates/algod_client/src/apis/get_ledger_state_delta.rs @@ -12,7 +12,6 @@ use algokit_http_client::{HttpClient, HttpMethod}; use serde::{Deserialize, Serialize}; use std::collections::HashMap; -use super::parameter_enums::*; use super::{AlgodApiError, ContentType, Error}; use algokit_transact::AlgorandMsgpack; @@ -40,26 +39,16 @@ pub enum GetLedgerStateDeltaError { pub async fn get_ledger_state_delta( http_client: &dyn HttpClient, round: u64, - format: Option, ) -> Result { let p_round = round; - let p_format = format; let path = format!("/v2/deltas/{round}", round = p_round); let mut query_params: HashMap = HashMap::new(); - if let Some(value) = p_format { - query_params.insert("format".to_string(), value.to_string()); - } - - let use_msgpack = p_format.map(|f| f != Format::Json).unwrap_or(true); + query_params.insert("format".to_string(), "msgpack".to_string()); let mut headers: HashMap = HashMap::new(); - if use_msgpack { - headers.insert("Accept".to_string(), "application/msgpack".to_string()); - } else { - headers.insert("Accept".to_string(), "application/json".to_string()); - } + headers.insert("Accept".to_string(), "application/msgpack".to_string()); let body = None; diff --git a/crates/algod_client/src/apis/get_ledger_state_delta_for_transaction_group.rs b/crates/algod_client/src/apis/get_ledger_state_delta_for_transaction_group.rs index e06a8d0ea..cf2a5ba01 100644 --- a/crates/algod_client/src/apis/get_ledger_state_delta_for_transaction_group.rs +++ b/crates/algod_client/src/apis/get_ledger_state_delta_for_transaction_group.rs @@ -12,7 +12,6 @@ use algokit_http_client::{HttpClient, HttpMethod}; use serde::{Deserialize, Serialize}; use std::collections::HashMap; -use super::parameter_enums::*; use super::{AlgodApiError, ContentType, Error}; use algokit_transact::AlgorandMsgpack; @@ -40,10 +39,8 @@ pub enum GetLedgerStateDeltaForTransactionGroupError { pub async fn get_ledger_state_delta_for_transaction_group( http_client: &dyn HttpClient, id: &str, - format: Option, ) -> Result { let p_id = id; - let p_format = format; let path = format!( "/v2/deltas/txn/group/{id}", @@ -51,18 +48,10 @@ pub async fn get_ledger_state_delta_for_transaction_group( ); let mut query_params: HashMap = HashMap::new(); - if let Some(value) = p_format { - query_params.insert("format".to_string(), value.to_string()); - } - - let use_msgpack = p_format.map(|f| f != Format::Json).unwrap_or(true); + query_params.insert("format".to_string(), "msgpack".to_string()); let mut headers: HashMap = HashMap::new(); - if use_msgpack { - headers.insert("Accept".to_string(), "application/msgpack".to_string()); - } else { - headers.insert("Accept".to_string(), "application/json".to_string()); - } + headers.insert("Accept".to_string(), "application/msgpack".to_string()); let body = None; diff --git a/crates/algod_client/src/apis/get_pending_transactions.rs b/crates/algod_client/src/apis/get_pending_transactions.rs index 825ae3148..c1118f8b0 100644 --- a/crates/algod_client/src/apis/get_pending_transactions.rs +++ b/crates/algod_client/src/apis/get_pending_transactions.rs @@ -12,7 +12,6 @@ use algokit_http_client::{HttpClient, HttpMethod}; use serde::{Deserialize, Serialize}; use std::collections::HashMap; -use super::parameter_enums::*; use super::{AlgodApiError, ContentType, Error}; use algokit_transact::AlgorandMsgpack; @@ -38,10 +37,8 @@ pub enum GetPendingTransactionsError { pub async fn get_pending_transactions( http_client: &dyn HttpClient, max: Option, - format: Option, ) -> Result { let p_max = max; - let p_format = format; let path = "/v2/transactions/pending".to_string(); @@ -49,18 +46,10 @@ pub async fn get_pending_transactions( if let Some(value) = p_max { query_params.insert("max".to_string(), value.to_string()); } - if let Some(value) = p_format { - query_params.insert("format".to_string(), value.to_string()); - } - - let use_msgpack = p_format.map(|f| f != Format::Json).unwrap_or(true); + query_params.insert("format".to_string(), "msgpack".to_string()); let mut headers: HashMap = HashMap::new(); - if use_msgpack { - headers.insert("Accept".to_string(), "application/msgpack".to_string()); - } else { - headers.insert("Accept".to_string(), "application/json".to_string()); - } + headers.insert("Accept".to_string(), "application/msgpack".to_string()); let body = None; diff --git a/crates/algod_client/src/apis/get_pending_transactions_by_address.rs b/crates/algod_client/src/apis/get_pending_transactions_by_address.rs index 27454f32f..0deb96514 100644 --- a/crates/algod_client/src/apis/get_pending_transactions_by_address.rs +++ b/crates/algod_client/src/apis/get_pending_transactions_by_address.rs @@ -12,7 +12,6 @@ use algokit_http_client::{HttpClient, HttpMethod}; use serde::{Deserialize, Serialize}; use std::collections::HashMap; -use super::parameter_enums::*; use super::{AlgodApiError, ContentType, Error}; use algokit_transact::AlgorandMsgpack; @@ -40,11 +39,9 @@ pub async fn get_pending_transactions_by_address( http_client: &dyn HttpClient, address: &str, max: Option, - format: Option, ) -> Result { let p_address = address; let p_max = max; - let p_format = format; let path = format!( "/v2/accounts/{address}/transactions/pending", @@ -55,18 +52,10 @@ pub async fn get_pending_transactions_by_address( if let Some(value) = p_max { query_params.insert("max".to_string(), value.to_string()); } - if let Some(value) = p_format { - query_params.insert("format".to_string(), value.to_string()); - } - - let use_msgpack = p_format.map(|f| f != Format::Json).unwrap_or(true); + query_params.insert("format".to_string(), "msgpack".to_string()); let mut headers: HashMap = HashMap::new(); - if use_msgpack { - headers.insert("Accept".to_string(), "application/msgpack".to_string()); - } else { - headers.insert("Accept".to_string(), "application/json".to_string()); - } + headers.insert("Accept".to_string(), "application/msgpack".to_string()); let body = None; diff --git a/crates/algod_client/src/apis/get_transaction_group_ledger_state_deltas_for_round.rs b/crates/algod_client/src/apis/get_transaction_group_ledger_state_deltas_for_round.rs index 76edb9a66..5c3247eb7 100644 --- a/crates/algod_client/src/apis/get_transaction_group_ledger_state_deltas_for_round.rs +++ b/crates/algod_client/src/apis/get_transaction_group_ledger_state_deltas_for_round.rs @@ -12,7 +12,6 @@ use algokit_http_client::{HttpClient, HttpMethod}; use serde::{Deserialize, Serialize}; use std::collections::HashMap; -use super::parameter_enums::*; use super::{AlgodApiError, ContentType, Error}; use algokit_transact::AlgorandMsgpack; @@ -40,26 +39,16 @@ pub enum GetTransactionGroupLedgerStateDeltasForRoundError { pub async fn get_transaction_group_ledger_state_deltas_for_round( http_client: &dyn HttpClient, round: u64, - format: Option, ) -> Result { let p_round = round; - let p_format = format; let path = format!("/v2/deltas/{round}/txn/group", round = p_round); let mut query_params: HashMap = HashMap::new(); - if let Some(value) = p_format { - query_params.insert("format".to_string(), value.to_string()); - } - - let use_msgpack = p_format.map(|f| f != Format::Json).unwrap_or(true); + query_params.insert("format".to_string(), "msgpack".to_string()); let mut headers: HashMap = HashMap::new(); - if use_msgpack { - headers.insert("Accept".to_string(), "application/msgpack".to_string()); - } else { - headers.insert("Accept".to_string(), "application/json".to_string()); - } + headers.insert("Accept".to_string(), "application/msgpack".to_string()); let body = None; diff --git a/crates/algod_client/src/apis/pending_transaction_information.rs b/crates/algod_client/src/apis/pending_transaction_information.rs index 69e7293dd..9daba2cbc 100644 --- a/crates/algod_client/src/apis/pending_transaction_information.rs +++ b/crates/algod_client/src/apis/pending_transaction_information.rs @@ -12,7 +12,6 @@ use algokit_http_client::{HttpClient, HttpMethod}; use serde::{Deserialize, Serialize}; use std::collections::HashMap; -use super::parameter_enums::*; use super::{AlgodApiError, ContentType, Error}; use algokit_transact::AlgorandMsgpack; @@ -43,10 +42,8 @@ pub enum PendingTransactionInformationError { pub async fn pending_transaction_information( http_client: &dyn HttpClient, txid: &str, - format: Option, ) -> Result { let p_txid = txid; - let p_format = format; let path = format!( "/v2/transactions/pending/{txid}", @@ -54,18 +51,10 @@ pub async fn pending_transaction_information( ); let mut query_params: HashMap = HashMap::new(); - if let Some(value) = p_format { - query_params.insert("format".to_string(), value.to_string()); - } - - let use_msgpack = p_format.map(|f| f != Format::Json).unwrap_or(true); + query_params.insert("format".to_string(), "msgpack".to_string()); let mut headers: HashMap = HashMap::new(); - if use_msgpack { - headers.insert("Accept".to_string(), "application/msgpack".to_string()); - } else { - headers.insert("Accept".to_string(), "application/json".to_string()); - } + headers.insert("Accept".to_string(), "application/msgpack".to_string()); let body = None; diff --git a/crates/algokit_utils/src/clients/client_manager.rs b/crates/algokit_utils/src/clients/client_manager.rs index 1b6dd2464..0154b39ce 100644 --- a/crates/algokit_utils/src/clients/client_manager.rs +++ b/crates/algokit_utils/src/clients/client_manager.rs @@ -237,7 +237,7 @@ impl ClientManager { }; AlgoClientConfig { - server: format!("https://{}-{}.algonode.cloud/", network, subdomain), + server: format!("https://{}-{}.4160.nodely.dev", network, subdomain), port: Some(443), token: None, } @@ -492,6 +492,7 @@ impl ClientManager { mod tests { use super::*; use crate::clients::network_client::AlgorandService; + use rstest::rstest; #[test] fn test_cache_initially_empty() { @@ -554,11 +555,45 @@ mod tests { assert!(matches!(config.token, Some(TokenHeader::String(_)))); } - #[test] - fn test_algonode_config() { - let config = ClientManager::get_algonode_config("testnet", AlgorandService::Algod); - assert_eq!(config.server, "https://testnet-api.algonode.cloud/"); + #[rstest] + #[case( + "mainnet", + AlgorandService::Algod, + "https://mainnet-api.4160.nodely.dev" + )] + #[case( + "mainnet", + AlgorandService::Indexer, + "https://mainnet-idx.4160.nodely.dev" + )] + #[case( + "testnet", + AlgorandService::Algod, + "https://testnet-api.4160.nodely.dev" + )] + #[case( + "testnet", + AlgorandService::Indexer, + "https://testnet-idx.4160.nodely.dev" + )] + fn test_algonode_config_variations( + #[case] network: &str, + #[case] service: AlgorandService, + #[case] expected_server: &str, + ) { + let config = ClientManager::get_algonode_config(network, service); + + assert_eq!(config.server, expected_server); assert_eq!(config.port, Some(443)); + assert!(config.token.is_none()); + } + + #[rstest] + #[case("mainnet")] + #[case("testnet")] + #[should_panic(expected = "KMD is not available on algonode")] + fn test_algonode_config_panics_for_kmd(#[case] network: &str) { + ClientManager::get_algonode_config(network, AlgorandService::Kmd); } #[test] diff --git a/crates/algokit_utils/src/transactions/composer.rs b/crates/algokit_utils/src/transactions/composer.rs index 9455faebc..78713bbd0 100644 --- a/crates/algokit_utils/src/transactions/composer.rs +++ b/crates/algokit_utils/src/transactions/composer.rs @@ -2168,7 +2168,7 @@ impl TransactionComposer { while current_round < start_round + max_rounds_to_wait as u64 { match self .algod_client - .pending_transaction_information(tx_id, Some(Format::Msgpack)) + .pending_transaction_information(tx_id) .await { Ok(response) => { diff --git a/crates/algokit_utils/tests/algod/pending_transaction_information.rs b/crates/algokit_utils/tests/algod/pending_transaction_information.rs index 6efbb6892..a75c13349 100644 --- a/crates/algokit_utils/tests/algod/pending_transaction_information.rs +++ b/crates/algokit_utils/tests/algod/pending_transaction_information.rs @@ -1,7 +1,6 @@ use crate::common::{ AlgorandFixtureResult, NetworkType, TestAccountConfig, TestResult, algorand_fixture, }; -use algod_client::apis::Format; use algokit_transact::{ AlgorandMsgpack, PaymentTransactionBuilder, Transaction, TransactionHeaderBuilder, }; @@ -82,7 +81,7 @@ async fn test_pending_transaction_broadcast( ); let pending_transaction = algod_client - .pending_transaction_information(&response.tx_id, Some(Format::Msgpack)) + .pending_transaction_information(&response.tx_id) .await?; assert_eq!(pending_transaction.pool_error, ""); diff --git a/packages/typescript/algod_client/src/apis/api.service.ts b/packages/typescript/algod_client/src/apis/api.service.ts index dded8da14..e487ec1eb 100644 --- a/packages/typescript/algod_client/src/apis/api.service.ts +++ b/packages/typescript/algod_client/src/apis/api.service.ts @@ -1,5 +1,6 @@ import type { BaseHttpRequest, ApiRequestOptions } from '../core/base-http-request' import { AlgorandSerializer } from '../core/model-runtime' +import type { BodyFormat } from '../core/model-runtime' import type { AbortCatchup, Account, @@ -90,13 +91,21 @@ import { export class AlgodApi { constructor(public readonly httpRequest: BaseHttpRequest) {} + private static acceptFor(format: BodyFormat): string { + return format === 'json' ? 'application/json' : 'application/msgpack' + } + + private static mediaFor(format: BodyFormat): string { + return format === 'json' ? 'application/json' : 'application/msgpack' + } + /** * Given a catchpoint, it aborts catching up to this catchpoint */ async abortCatchup(catchpoint: string, requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'DELETE', @@ -126,8 +135,8 @@ export class AlgodApi { requestOptions?: ApiRequestOptions, ): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = (params?.format as 'json' | 'msgpack' | undefined) ?? 'msgpack' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = (params?.format as BodyFormat | undefined) ?? 'msgpack' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -157,8 +166,8 @@ export class AlgodApi { requestOptions?: ApiRequestOptions, ): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = (params?.format as 'json' | 'msgpack' | undefined) ?? 'msgpack' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = (params?.format as BodyFormat | undefined) ?? 'msgpack' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -187,8 +196,8 @@ export class AlgodApi { requestOptions?: ApiRequestOptions, ): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -217,8 +226,8 @@ export class AlgodApi { requestOptions?: ApiRequestOptions, ): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = (params?.format as 'json' | 'msgpack' | undefined) ?? 'msgpack' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = (params?.format as BodyFormat | undefined) ?? 'msgpack' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -240,11 +249,11 @@ export class AlgodApi { async addParticipationKey(params?: { body: string }, requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'msgpack' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'msgpack' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const bodyMeta = undefined - const mediaType = bodyMeta ? (responseFormat === 'json' ? 'application/json' : 'application/msgpack') : undefined + const mediaType = bodyMeta ? AlgodApi.mediaFor(responseFormat) : undefined if (mediaType) headers['Content-Type'] = mediaType const serializedBody = bodyMeta && params?.body !== undefined ? AlgorandSerializer.encode(params.body, bodyMeta, responseFormat) : params?.body @@ -272,11 +281,11 @@ export class AlgodApi { */ async appendKeys(participationId: string, params?: { body: string }, requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'msgpack' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'msgpack' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const bodyMeta = undefined - const mediaType = bodyMeta ? (responseFormat === 'json' ? 'application/json' : 'application/msgpack') : undefined + const mediaType = bodyMeta ? AlgodApi.mediaFor(responseFormat) : undefined if (mediaType) headers['Content-Type'] = mediaType const serializedBody = bodyMeta && params?.body !== undefined ? AlgorandSerializer.encode(params.body, bodyMeta, responseFormat) : params?.body @@ -304,8 +313,8 @@ export class AlgodApi { */ async deleteParticipationKeyById(participationId: string, requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'DELETE', @@ -327,8 +336,8 @@ export class AlgodApi { async experimentalCheck(requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -354,8 +363,8 @@ export class AlgodApi { requestOptions?: ApiRequestOptions, ): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'POST', @@ -388,8 +397,8 @@ export class AlgodApi { requestOptions?: ApiRequestOptions, ): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -418,8 +427,8 @@ export class AlgodApi { requestOptions?: ApiRequestOptions, ): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -444,8 +453,8 @@ export class AlgodApi { */ async getApplicationById(applicationId: number | bigint, requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -470,8 +479,8 @@ export class AlgodApi { */ async getAssetById(assetId: number | bigint, requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -491,20 +500,16 @@ export class AlgodApi { return payload as Asset } - async getBlock( - round: number | bigint, - params?: { headerOnly?: boolean; format?: 'msgpack' }, - requestOptions?: ApiRequestOptions, - ): Promise { + async getBlock(round: number | bigint, params?: { headerOnly?: boolean }, requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = (params?.format as 'json' | 'msgpack' | undefined) ?? 'msgpack' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'msgpack' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', url: '/v2/blocks/{round}', path: { round: typeof round === 'bigint' ? round.toString() : round }, - query: { 'header-only': params?.headerOnly, format: params?.format }, + query: { 'header-only': params?.headerOnly, format: 'msgpack' }, headers, body: undefined, mediaType: undefined, @@ -520,8 +525,8 @@ export class AlgodApi { async getBlockHash(round: number | bigint, requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -546,8 +551,8 @@ export class AlgodApi { */ async getBlockLogs(round: number | bigint, requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -572,8 +577,8 @@ export class AlgodApi { */ async getBlockTimeStampOffset(requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -595,8 +600,8 @@ export class AlgodApi { async getBlockTxids(round: number | bigint, requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -621,8 +626,8 @@ export class AlgodApi { */ async getConfig(requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -647,8 +652,8 @@ export class AlgodApi { */ async getDebugSettingsProf(requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -673,8 +678,8 @@ export class AlgodApi { */ async getGenesis(requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -697,20 +702,16 @@ export class AlgodApi { /** * Get ledger deltas for a round. */ - async getLedgerStateDelta( - round: number | bigint, - params?: { format?: 'msgpack' }, - requestOptions?: ApiRequestOptions, - ): Promise { + async getLedgerStateDelta(round: number | bigint, requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = (params?.format as 'json' | 'msgpack' | undefined) ?? 'msgpack' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'msgpack' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', url: '/v2/deltas/{round}', path: { round: typeof round === 'bigint' ? round.toString() : round }, - query: { format: params?.format }, + query: { format: 'msgpack' }, headers, body: undefined, mediaType: undefined, @@ -727,20 +728,16 @@ export class AlgodApi { /** * Get a ledger delta for a given transaction group. */ - async getLedgerStateDeltaForTransactionGroup( - id: string, - params?: { format?: 'msgpack' }, - requestOptions?: ApiRequestOptions, - ): Promise { + async getLedgerStateDeltaForTransactionGroup(id: string, requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = (params?.format as 'json' | 'msgpack' | undefined) ?? 'msgpack' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'msgpack' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', url: '/v2/deltas/txn/group/{id}', path: { id: id }, - query: { format: params?.format }, + query: { format: 'msgpack' }, headers, body: undefined, mediaType: undefined, @@ -756,8 +753,8 @@ export class AlgodApi { async getLightBlockHeaderProof(round: number | bigint, requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -782,8 +779,8 @@ export class AlgodApi { */ async getParticipationKeyById(participationId: string, requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -808,8 +805,8 @@ export class AlgodApi { */ async getParticipationKeys(requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -822,7 +819,11 @@ export class AlgodApi { ...(requestOptions ?? {}), }) - const responseMeta = { name: 'ParticipationKey[]', kind: 'array', arrayItems: { kind: 'model', meta: () => ParticipationKeyMeta } } + const responseMeta = { + name: 'ParticipationKey[]', + kind: 'array', + arrayItems: { kind: 'model', meta: () => ParticipationKeyMeta } as const, + } as const if (responseMeta) { return AlgorandSerializer.decode(payload, responseMeta, responseFormat) } @@ -832,19 +833,16 @@ export class AlgodApi { /** * Get the list of pending transactions, sorted by priority, in decreasing order, truncated at the end at MAX. If MAX = 0, returns all pending transactions. */ - async getPendingTransactions( - params?: { max?: number | bigint; format?: 'msgpack' }, - requestOptions?: ApiRequestOptions, - ): Promise { + async getPendingTransactions(params?: { max?: number | bigint }, requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = (params?.format as 'json' | 'msgpack' | undefined) ?? 'msgpack' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'msgpack' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', url: '/v2/transactions/pending', path: {}, - query: { max: typeof params?.max === 'bigint' ? (params!.max as bigint).toString() : params?.max, format: params?.format }, + query: { max: typeof params?.max === 'bigint' ? (params!.max as bigint).toString() : params?.max, format: 'msgpack' }, headers, body: undefined, mediaType: undefined, @@ -863,18 +861,18 @@ export class AlgodApi { */ async getPendingTransactionsByAddress( address: string, - params?: { max?: number | bigint; format?: 'msgpack' }, + params?: { max?: number | bigint }, requestOptions?: ApiRequestOptions, ): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = (params?.format as 'json' | 'msgpack' | undefined) ?? 'msgpack' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'msgpack' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', url: '/v2/accounts/{address}/transactions/pending', path: { address: address }, - query: { max: typeof params?.max === 'bigint' ? (params!.max as bigint).toString() : params?.max, format: params?.format }, + query: { max: typeof params?.max === 'bigint' ? (params!.max as bigint).toString() : params?.max, format: 'msgpack' }, headers, body: undefined, mediaType: undefined, @@ -890,8 +888,8 @@ export class AlgodApi { async getReady(requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -913,8 +911,8 @@ export class AlgodApi { async getStateProof(round: number | bigint, requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -936,8 +934,8 @@ export class AlgodApi { async getStatus(requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -959,8 +957,8 @@ export class AlgodApi { async getSupply(requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -985,8 +983,8 @@ export class AlgodApi { */ async getSyncRound(requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -1011,18 +1009,17 @@ export class AlgodApi { */ async getTransactionGroupLedgerStateDeltasForRound( round: number | bigint, - params?: { format?: 'msgpack' }, requestOptions?: ApiRequestOptions, ): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = (params?.format as 'json' | 'msgpack' | undefined) ?? 'msgpack' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'msgpack' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', url: '/v2/deltas/{round}/txn/group', path: { round: typeof round === 'bigint' ? round.toString() : round }, - query: { format: params?.format }, + query: { format: 'msgpack' }, headers, body: undefined, mediaType: undefined, @@ -1043,8 +1040,8 @@ export class AlgodApi { requestOptions?: ApiRequestOptions, ): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -1069,8 +1066,8 @@ export class AlgodApi { */ async getVersion(requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -1092,8 +1089,8 @@ export class AlgodApi { async healthCheck(requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -1115,8 +1112,8 @@ export class AlgodApi { async metrics(requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -1143,20 +1140,16 @@ export class AlgodApi { * - transaction removed from pool due to error (committed round = 0, pool error != "") * Or the transaction may have happened sufficiently long ago that the node no longer remembers it, and this will return an error. */ - async pendingTransactionInformation( - txid: string, - params?: { format?: 'msgpack' }, - requestOptions?: ApiRequestOptions, - ): Promise { + async pendingTransactionInformation(txid: string, requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = (params?.format as 'json' | 'msgpack' | undefined) ?? 'msgpack' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'msgpack' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', url: '/v2/transactions/pending/{txid}', path: { txid: txid }, - query: { format: params?.format }, + query: { format: 'msgpack' }, headers, body: undefined, mediaType: undefined, @@ -1175,8 +1168,8 @@ export class AlgodApi { */ async putDebugSettingsProf(requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'PUT', @@ -1198,8 +1191,8 @@ export class AlgodApi { async rawTransaction(params?: { body: Uint8Array }, requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const serializedBody = params?.body ?? undefined const mediaType = 'application/msgpack' @@ -1225,8 +1218,8 @@ export class AlgodApi { async rawTransactionAsync(params?: { body: Uint8Array }, requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const serializedBody = params?.body ?? undefined const mediaType = 'application/msgpack' @@ -1255,8 +1248,8 @@ export class AlgodApi { */ async setBlockTimeStampOffset(offset: number | bigint, requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'POST', @@ -1281,8 +1274,8 @@ export class AlgodApi { */ async setSyncRound(round: number | bigint, requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'POST', @@ -1307,8 +1300,8 @@ export class AlgodApi { */ async shutdownNode(params?: { timeout?: number | bigint }, requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'POST', @@ -1333,11 +1326,11 @@ export class AlgodApi { requestOptions?: ApiRequestOptions, ): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = (params?.format as 'json' | 'msgpack' | undefined) ?? 'msgpack' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = (params?.format as BodyFormat | undefined) ?? 'msgpack' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const bodyMeta = SimulateRequestMeta - const mediaType = bodyMeta ? (responseFormat === 'json' ? 'application/json' : 'application/msgpack') : undefined + const mediaType = bodyMeta ? AlgodApi.mediaFor(responseFormat) : undefined if (mediaType) headers['Content-Type'] = mediaType const serializedBody = bodyMeta && params?.body !== undefined ? AlgorandSerializer.encode(params.body, bodyMeta, responseFormat) : params?.body @@ -1365,8 +1358,8 @@ export class AlgodApi { */ async startCatchup(catchpoint: string, params?: { min?: number | bigint }, requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'POST', @@ -1391,8 +1384,8 @@ export class AlgodApi { */ async swaggerJson(requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -1417,11 +1410,11 @@ export class AlgodApi { */ async tealCompile(params?: { sourcemap?: boolean; body: string }, requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const bodyMeta = undefined - const mediaType = bodyMeta ? (responseFormat === 'json' ? 'application/json' : 'application/msgpack') : undefined + const mediaType = bodyMeta ? AlgodApi.mediaFor(responseFormat) : undefined if (mediaType) headers['Content-Type'] = mediaType const serializedBody = bodyMeta && params?.body !== undefined ? AlgorandSerializer.encode(params.body, bodyMeta, responseFormat) : params?.body @@ -1449,8 +1442,8 @@ export class AlgodApi { */ async tealDisassemble(params?: { body: Uint8Array }, requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const serializedBody = params?.body ?? undefined const mediaType = 'application/msgpack' @@ -1479,11 +1472,11 @@ export class AlgodApi { */ async tealDryrun(params?: { body?: DryrunRequest }, requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'msgpack' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'msgpack' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const bodyMeta = DryrunRequestMeta - const mediaType = bodyMeta ? (responseFormat === 'json' ? 'application/json' : 'application/msgpack') : undefined + const mediaType = bodyMeta ? AlgodApi.mediaFor(responseFormat) : undefined if (mediaType) headers['Content-Type'] = mediaType const serializedBody = bodyMeta && params?.body !== undefined ? AlgorandSerializer.encode(params.body, bodyMeta, responseFormat) : params?.body @@ -1508,8 +1501,8 @@ export class AlgodApi { async transactionParams(requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -1534,8 +1527,8 @@ export class AlgodApi { */ async unsetSyncRound(requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'DELETE', @@ -1560,8 +1553,8 @@ export class AlgodApi { */ async waitForBlock(round: number | bigint, requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = AlgodApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', diff --git a/packages/typescript/algod_client/src/core/request.ts b/packages/typescript/algod_client/src/core/request.ts index 3a4ae2941..d3429960e 100644 --- a/packages/typescript/algod_client/src/core/request.ts +++ b/packages/typescript/algod_client/src/core/request.ts @@ -58,23 +58,25 @@ export async function request( headers['Authorization'] = `Basic ${btoa(`${config.username}:${config.password}`)}` } - let body: BodyValue | undefined = undefined + let bodyPayload: BodyInit | undefined = undefined if (options.body != null) { - if (options.body instanceof Uint8Array || typeof options.body === 'string') { - body = options.body + if (options.body instanceof Uint8Array) { + bodyPayload = options.body + } else if (typeof options.body === 'string') { + bodyPayload = options.body } else if (options.mediaType?.includes('msgpack')) { - body = encodeMsgPack(options.body) + bodyPayload = encodeMsgPack(options.body) } else if (options.mediaType?.includes('json')) { - body = JSON.stringify(options.body) + bodyPayload = JSON.stringify(options.body) } else { - body = options.body + bodyPayload = JSON.stringify(options.body) } } const response = await fetch(url.toString(), { method: options.method, headers, - body, + body: bodyPayload, credentials: config.credentials, }) diff --git a/packages/typescript/algokit_utils/tests/algod/pendingTransaction.test.ts b/packages/typescript/algokit_utils/tests/algod/pendingTransaction.test.ts index 7ddab7c2e..39e69e604 100644 --- a/packages/typescript/algokit_utils/tests/algod/pendingTransaction.test.ts +++ b/packages/typescript/algokit_utils/tests/algod/pendingTransaction.test.ts @@ -37,7 +37,7 @@ describe('Algod pendingTransaction', () => { let pending: PendingTransactionResponse | undefined const maxAttempts = 10 for (let i = 0; i < maxAttempts; i++) { - pending = await client.pendingTransactionInformation(txId, { format: 'msgpack' }) + pending = await client.pendingTransactionInformation(txId) if (pending?.confirmedRound || pending?.poolError) { break } diff --git a/packages/typescript/indexer_client/src/apis/api.service.ts b/packages/typescript/indexer_client/src/apis/api.service.ts index 1f0f5cbcc..14b1493fc 100644 --- a/packages/typescript/indexer_client/src/apis/api.service.ts +++ b/packages/typescript/indexer_client/src/apis/api.service.ts @@ -1,5 +1,6 @@ import type { BaseHttpRequest, ApiRequestOptions } from '../core/base-http-request' import { AlgorandSerializer } from '../core/model-runtime' +import type { BodyFormat } from '../core/model-runtime' import type { Block, Box, @@ -50,6 +51,14 @@ import { export class IndexerApi { constructor(public readonly httpRequest: BaseHttpRequest) {} + private static acceptFor(format: BodyFormat): string { + return format === 'json' ? 'application/json' : 'application/msgpack' + } + + private static mediaFor(format: BodyFormat): string { + return format === 'json' ? 'application/json' : 'application/msgpack' + } + /** * Lookup an account's asset holdings, optionally for a specific ID. */ @@ -59,8 +68,8 @@ export class IndexerApi { requestOptions?: ApiRequestOptions, ): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = IndexerApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -94,8 +103,8 @@ export class IndexerApi { requestOptions?: ApiRequestOptions, ): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = IndexerApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -133,8 +142,8 @@ export class IndexerApi { requestOptions?: ApiRequestOptions, ): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = IndexerApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -167,8 +176,8 @@ export class IndexerApi { requestOptions?: ApiRequestOptions, ): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = IndexerApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -202,8 +211,8 @@ export class IndexerApi { requestOptions?: ApiRequestOptions, ): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = IndexerApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -253,8 +262,8 @@ export class IndexerApi { requestOptions?: ApiRequestOptions, ): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = IndexerApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -303,8 +312,8 @@ export class IndexerApi { requestOptions?: ApiRequestOptions, ): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = IndexerApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -333,8 +342,8 @@ export class IndexerApi { requestOptions?: ApiRequestOptions, ): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = IndexerApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -370,8 +379,8 @@ export class IndexerApi { requestOptions?: ApiRequestOptions, ): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = IndexerApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -413,8 +422,8 @@ export class IndexerApi { requestOptions?: ApiRequestOptions, ): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = IndexerApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -453,8 +462,8 @@ export class IndexerApi { requestOptions?: ApiRequestOptions, ): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = IndexerApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -501,8 +510,8 @@ export class IndexerApi { requestOptions?: ApiRequestOptions, ): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = IndexerApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -549,8 +558,8 @@ export class IndexerApi { */ async lookupBlock(roundNumber: number | bigint, params?: { headerOnly?: boolean }, requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = IndexerApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -575,8 +584,8 @@ export class IndexerApi { */ async lookupTransaction(txid: string, requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = IndexerApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -598,8 +607,8 @@ export class IndexerApi { async makeHealthCheck(requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = IndexerApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -639,8 +648,8 @@ export class IndexerApi { requestOptions?: ApiRequestOptions, ): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = IndexerApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -685,8 +694,8 @@ export class IndexerApi { requestOptions?: ApiRequestOptions, ): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = IndexerApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -714,8 +723,8 @@ export class IndexerApi { requestOptions?: ApiRequestOptions, ): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = IndexerApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -757,8 +766,8 @@ export class IndexerApi { requestOptions?: ApiRequestOptions, ): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = IndexerApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -804,8 +813,8 @@ export class IndexerApi { requestOptions?: ApiRequestOptions, ): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = IndexerApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -864,8 +873,8 @@ export class IndexerApi { requestOptions?: ApiRequestOptions, ): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = IndexerApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', diff --git a/packages/typescript/indexer_client/src/core/request.ts b/packages/typescript/indexer_client/src/core/request.ts index 201bbb69e..9ab220bea 100644 --- a/packages/typescript/indexer_client/src/core/request.ts +++ b/packages/typescript/indexer_client/src/core/request.ts @@ -58,23 +58,25 @@ export async function request( headers['Authorization'] = `Basic ${btoa(`${config.username}:${config.password}`)}` } - let body: BodyValue | undefined = undefined + let bodyPayload: BodyInit | undefined = undefined if (options.body != null) { - if (options.body instanceof Uint8Array || typeof options.body === 'string') { - body = options.body + if (options.body instanceof Uint8Array) { + bodyPayload = options.body + } else if (typeof options.body === 'string') { + bodyPayload = options.body } else if (options.mediaType?.includes('msgpack')) { - body = encodeMsgPack(options.body) + bodyPayload = encodeMsgPack(options.body) } else if (options.mediaType?.includes('json')) { - body = JSON.stringify(options.body) + bodyPayload = JSON.stringify(options.body) } else { - body = options.body + bodyPayload = JSON.stringify(options.body) } } const response = await fetch(url.toString(), { method: options.method, headers, - body, + body: bodyPayload, credentials: config.credentials, }) diff --git a/packages/typescript/kmd_client/src/apis/api.service.ts b/packages/typescript/kmd_client/src/apis/api.service.ts index 2ad036218..56e104c63 100644 --- a/packages/typescript/kmd_client/src/apis/api.service.ts +++ b/packages/typescript/kmd_client/src/apis/api.service.ts @@ -1,5 +1,6 @@ import type { BaseHttpRequest, ApiRequestOptions } from '../core/base-http-request' import { AlgorandSerializer } from '../core/model-runtime' +import type { BodyFormat } from '../core/model-runtime' import type { CreateWalletRequest, DeleteKeyResponse, @@ -88,16 +89,24 @@ import { export class KmdApi { constructor(public readonly httpRequest: BaseHttpRequest) {} + private static acceptFor(format: BodyFormat): string { + return format === 'json' ? 'application/json' : 'application/msgpack' + } + + private static mediaFor(format: BodyFormat): string { + return format === 'json' ? 'application/json' : 'application/msgpack' + } + /** * Create a new wallet (collection of keys) with the given parameters. */ async createWallet(params?: { body: CreateWalletRequest }, requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = KmdApi.acceptFor(responseFormat) const bodyMeta = CreateWalletRequestMeta - const mediaType = bodyMeta ? (responseFormat === 'json' ? 'application/json' : 'application/msgpack') : undefined + const mediaType = bodyMeta ? KmdApi.mediaFor(responseFormat) : undefined if (mediaType) headers['Content-Type'] = mediaType const serializedBody = bodyMeta && params?.body !== undefined ? AlgorandSerializer.encode(params.body, bodyMeta, responseFormat) : params?.body @@ -125,8 +134,8 @@ export class KmdApi { */ async deleteKey(requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = KmdApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'DELETE', @@ -151,8 +160,8 @@ export class KmdApi { */ async deleteMultisig(requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = KmdApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'DELETE', @@ -177,11 +186,11 @@ export class KmdApi { */ async exportKey(params?: { body: ExportKeyRequest }, requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = KmdApi.acceptFor(responseFormat) const bodyMeta = ExportKeyRequestMeta - const mediaType = bodyMeta ? (responseFormat === 'json' ? 'application/json' : 'application/msgpack') : undefined + const mediaType = bodyMeta ? KmdApi.mediaFor(responseFormat) : undefined if (mediaType) headers['Content-Type'] = mediaType const serializedBody = bodyMeta && params?.body !== undefined ? AlgorandSerializer.encode(params.body, bodyMeta, responseFormat) : params?.body @@ -212,11 +221,11 @@ export class KmdApi { requestOptions?: ApiRequestOptions, ): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = KmdApi.acceptFor(responseFormat) const bodyMeta = ExportMasterKeyRequestMeta - const mediaType = bodyMeta ? (responseFormat === 'json' ? 'application/json' : 'application/msgpack') : undefined + const mediaType = bodyMeta ? KmdApi.mediaFor(responseFormat) : undefined if (mediaType) headers['Content-Type'] = mediaType const serializedBody = bodyMeta && params?.body !== undefined ? AlgorandSerializer.encode(params.body, bodyMeta, responseFormat) : params?.body @@ -244,11 +253,11 @@ export class KmdApi { */ async exportMultisig(params?: { body: ExportMultisigRequest }, requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = KmdApi.acceptFor(responseFormat) const bodyMeta = ExportMultisigRequestMeta - const mediaType = bodyMeta ? (responseFormat === 'json' ? 'application/json' : 'application/msgpack') : undefined + const mediaType = bodyMeta ? KmdApi.mediaFor(responseFormat) : undefined if (mediaType) headers['Content-Type'] = mediaType const serializedBody = bodyMeta && params?.body !== undefined ? AlgorandSerializer.encode(params.body, bodyMeta, responseFormat) : params?.body @@ -276,11 +285,11 @@ export class KmdApi { */ async generateKey(params?: { body: GenerateKeyRequest }, requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = KmdApi.acceptFor(responseFormat) const bodyMeta = GenerateKeyRequestMeta - const mediaType = bodyMeta ? (responseFormat === 'json' ? 'application/json' : 'application/msgpack') : undefined + const mediaType = bodyMeta ? KmdApi.mediaFor(responseFormat) : undefined if (mediaType) headers['Content-Type'] = mediaType const serializedBody = bodyMeta && params?.body !== undefined ? AlgorandSerializer.encode(params.body, bodyMeta, responseFormat) : params?.body @@ -305,8 +314,8 @@ export class KmdApi { async getVersion(requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = KmdApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -331,11 +340,11 @@ export class KmdApi { */ async getWalletInfo(params?: { body: WalletInfoRequest }, requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = KmdApi.acceptFor(responseFormat) const bodyMeta = WalletInfoRequestMeta - const mediaType = bodyMeta ? (responseFormat === 'json' ? 'application/json' : 'application/msgpack') : undefined + const mediaType = bodyMeta ? KmdApi.mediaFor(responseFormat) : undefined if (mediaType) headers['Content-Type'] = mediaType const serializedBody = bodyMeta && params?.body !== undefined ? AlgorandSerializer.encode(params.body, bodyMeta, responseFormat) : params?.body @@ -363,11 +372,11 @@ export class KmdApi { */ async importKey(params?: { body: ImportKeyRequest }, requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = KmdApi.acceptFor(responseFormat) const bodyMeta = ImportKeyRequestMeta - const mediaType = bodyMeta ? (responseFormat === 'json' ? 'application/json' : 'application/msgpack') : undefined + const mediaType = bodyMeta ? KmdApi.mediaFor(responseFormat) : undefined if (mediaType) headers['Content-Type'] = mediaType const serializedBody = bodyMeta && params?.body !== undefined ? AlgorandSerializer.encode(params.body, bodyMeta, responseFormat) : params?.body @@ -395,11 +404,11 @@ export class KmdApi { */ async importMultisig(params?: { body: ImportMultisigRequest }, requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = KmdApi.acceptFor(responseFormat) const bodyMeta = ImportMultisigRequestMeta - const mediaType = bodyMeta ? (responseFormat === 'json' ? 'application/json' : 'application/msgpack') : undefined + const mediaType = bodyMeta ? KmdApi.mediaFor(responseFormat) : undefined if (mediaType) headers['Content-Type'] = mediaType const serializedBody = bodyMeta && params?.body !== undefined ? AlgorandSerializer.encode(params.body, bodyMeta, responseFormat) : params?.body @@ -430,11 +439,11 @@ export class KmdApi { requestOptions?: ApiRequestOptions, ): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = KmdApi.acceptFor(responseFormat) const bodyMeta = InitWalletHandleTokenRequestMeta - const mediaType = bodyMeta ? (responseFormat === 'json' ? 'application/json' : 'application/msgpack') : undefined + const mediaType = bodyMeta ? KmdApi.mediaFor(responseFormat) : undefined if (mediaType) headers['Content-Type'] = mediaType const serializedBody = bodyMeta && params?.body !== undefined ? AlgorandSerializer.encode(params.body, bodyMeta, responseFormat) : params?.body @@ -462,11 +471,11 @@ export class KmdApi { */ async listKeysInWallet(params?: { body: ListKeysRequest }, requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = KmdApi.acceptFor(responseFormat) const bodyMeta = ListKeysRequestMeta - const mediaType = bodyMeta ? (responseFormat === 'json' ? 'application/json' : 'application/msgpack') : undefined + const mediaType = bodyMeta ? KmdApi.mediaFor(responseFormat) : undefined if (mediaType) headers['Content-Type'] = mediaType const serializedBody = bodyMeta && params?.body !== undefined ? AlgorandSerializer.encode(params.body, bodyMeta, responseFormat) : params?.body @@ -494,11 +503,11 @@ export class KmdApi { */ async listMultisg(params?: { body: ListMultisigRequest }, requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = KmdApi.acceptFor(responseFormat) const bodyMeta = ListMultisigRequestMeta - const mediaType = bodyMeta ? (responseFormat === 'json' ? 'application/json' : 'application/msgpack') : undefined + const mediaType = bodyMeta ? KmdApi.mediaFor(responseFormat) : undefined if (mediaType) headers['Content-Type'] = mediaType const serializedBody = bodyMeta && params?.body !== undefined ? AlgorandSerializer.encode(params.body, bodyMeta, responseFormat) : params?.body @@ -526,8 +535,8 @@ export class KmdApi { */ async listWallets(requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = KmdApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', @@ -555,11 +564,11 @@ export class KmdApi { requestOptions?: ApiRequestOptions, ): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = KmdApi.acceptFor(responseFormat) const bodyMeta = ReleaseWalletHandleTokenRequestMeta - const mediaType = bodyMeta ? (responseFormat === 'json' ? 'application/json' : 'application/msgpack') : undefined + const mediaType = bodyMeta ? KmdApi.mediaFor(responseFormat) : undefined if (mediaType) headers['Content-Type'] = mediaType const serializedBody = bodyMeta && params?.body !== undefined ? AlgorandSerializer.encode(params.body, bodyMeta, responseFormat) : params?.body @@ -587,11 +596,11 @@ export class KmdApi { */ async renameWallet(params?: { body: RenameWalletRequest }, requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = KmdApi.acceptFor(responseFormat) const bodyMeta = RenameWalletRequestMeta - const mediaType = bodyMeta ? (responseFormat === 'json' ? 'application/json' : 'application/msgpack') : undefined + const mediaType = bodyMeta ? KmdApi.mediaFor(responseFormat) : undefined if (mediaType) headers['Content-Type'] = mediaType const serializedBody = bodyMeta && params?.body !== undefined ? AlgorandSerializer.encode(params.body, bodyMeta, responseFormat) : params?.body @@ -622,11 +631,11 @@ export class KmdApi { requestOptions?: ApiRequestOptions, ): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = KmdApi.acceptFor(responseFormat) const bodyMeta = RenewWalletHandleTokenRequestMeta - const mediaType = bodyMeta ? (responseFormat === 'json' ? 'application/json' : 'application/msgpack') : undefined + const mediaType = bodyMeta ? KmdApi.mediaFor(responseFormat) : undefined if (mediaType) headers['Content-Type'] = mediaType const serializedBody = bodyMeta && params?.body !== undefined ? AlgorandSerializer.encode(params.body, bodyMeta, responseFormat) : params?.body @@ -657,11 +666,11 @@ export class KmdApi { requestOptions?: ApiRequestOptions, ): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = KmdApi.acceptFor(responseFormat) const bodyMeta = SignProgramMultisigRequestMeta - const mediaType = bodyMeta ? (responseFormat === 'json' ? 'application/json' : 'application/msgpack') : undefined + const mediaType = bodyMeta ? KmdApi.mediaFor(responseFormat) : undefined if (mediaType) headers['Content-Type'] = mediaType const serializedBody = bodyMeta && params?.body !== undefined ? AlgorandSerializer.encode(params.body, bodyMeta, responseFormat) : params?.body @@ -692,11 +701,11 @@ export class KmdApi { requestOptions?: ApiRequestOptions, ): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = KmdApi.acceptFor(responseFormat) const bodyMeta = SignMultisigRequestMeta - const mediaType = bodyMeta ? (responseFormat === 'json' ? 'application/json' : 'application/msgpack') : undefined + const mediaType = bodyMeta ? KmdApi.mediaFor(responseFormat) : undefined if (mediaType) headers['Content-Type'] = mediaType const serializedBody = bodyMeta && params?.body !== undefined ? AlgorandSerializer.encode(params.body, bodyMeta, responseFormat) : params?.body @@ -724,11 +733,11 @@ export class KmdApi { */ async signProgram(params?: { body: SignProgramRequest }, requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = KmdApi.acceptFor(responseFormat) const bodyMeta = SignProgramRequestMeta - const mediaType = bodyMeta ? (responseFormat === 'json' ? 'application/json' : 'application/msgpack') : undefined + const mediaType = bodyMeta ? KmdApi.mediaFor(responseFormat) : undefined if (mediaType) headers['Content-Type'] = mediaType const serializedBody = bodyMeta && params?.body !== undefined ? AlgorandSerializer.encode(params.body, bodyMeta, responseFormat) : params?.body @@ -759,11 +768,11 @@ export class KmdApi { requestOptions?: ApiRequestOptions, ): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = KmdApi.acceptFor(responseFormat) const bodyMeta = SignTransactionRequestMeta - const mediaType = bodyMeta ? (responseFormat === 'json' ? 'application/json' : 'application/msgpack') : undefined + const mediaType = bodyMeta ? KmdApi.mediaFor(responseFormat) : undefined if (mediaType) headers['Content-Type'] = mediaType const serializedBody = bodyMeta && params?.body !== undefined ? AlgorandSerializer.encode(params.body, bodyMeta, responseFormat) : params?.body @@ -791,8 +800,8 @@ export class KmdApi { */ async swaggerHandler(requestOptions?: ApiRequestOptions): Promise { const headers: Record = {} - const responseFormat: 'json' | 'msgpack' = 'json' - headers['Accept'] = responseFormat === 'json' ? 'application/json' : 'application/msgpack' + const responseFormat: BodyFormat = 'json' + headers['Accept'] = KmdApi.acceptFor(responseFormat) const payload = await this.httpRequest.request({ method: 'GET', diff --git a/packages/typescript/kmd_client/src/core/request.ts b/packages/typescript/kmd_client/src/core/request.ts index 7be1898eb..b8ae5cdc9 100644 --- a/packages/typescript/kmd_client/src/core/request.ts +++ b/packages/typescript/kmd_client/src/core/request.ts @@ -58,23 +58,25 @@ export async function request( headers['Authorization'] = `Basic ${btoa(`${config.username}:${config.password}`)}` } - let body: BodyValue | undefined = undefined + let bodyPayload: BodyInit | undefined = undefined if (options.body != null) { - if (options.body instanceof Uint8Array || typeof options.body === 'string') { - body = options.body + if (options.body instanceof Uint8Array) { + bodyPayload = options.body + } else if (typeof options.body === 'string') { + bodyPayload = options.body } else if (options.mediaType?.includes('msgpack')) { - body = encodeMsgPack(options.body) + bodyPayload = encodeMsgPack(options.body) } else if (options.mediaType?.includes('json')) { - body = JSON.stringify(options.body) + bodyPayload = JSON.stringify(options.body) } else { - body = options.body + bodyPayload = JSON.stringify(options.body) } } const response = await fetch(url.toString(), { method: options.method, headers, - body, + body: bodyPayload, credentials: config.credentials, })