{{ self::ts_doc_block(doc, "") }}export function {{ name }}({% for param in params %}{{ param.name }}: {{ param.ts_type }}{% if !loop.last %}, {% endif %}{% endfor %}): {{ return_type_str }} {
{%- if !wrapper_code.is_empty() %}
  {{ wrapper_code }}
{%- endif %}
{%- if cleanup_code.is_empty() %}
{%- if return_route.is_void() %}
  (_exports.{{ ffi_name }} as Function)({{ call_args }});
{%- elif return_route.is_direct() %}
  return (_exports.{{ ffi_name }} as Function)({{ call_args }}){{ return_route.ts_cast() }};
{%- elif return_route.is_void_slot() %}
  (_exports.{{ ffi_name }} as Function)({{ call_args }});
  return {{ return_route.decode_expr() }};
{%- elif return_route.is_packed() %}
  const packed = (_exports.{{ ffi_name }} as Function)({{ call_args }}) as bigint;
  const reader = _module.takePackedBuffer(packed);
  return {{ return_route.decode_expr() }};
{%- else %}
  const packed = (_exports.{{ ffi_name }} as Function)({{ call_args }}) as bigint;
  return {{ return_route.decode_expr() }};
{%- endif %}
{%- else %}
  try {
{%- if return_route.is_void() %}
    (_exports.{{ ffi_name }} as Function)({{ call_args }});
{%- elif return_route.is_direct() %}
    return (_exports.{{ ffi_name }} as Function)({{ call_args }}){{ return_route.ts_cast() }};
{%- elif return_route.is_void_slot() %}
    (_exports.{{ ffi_name }} as Function)({{ call_args }});
    return {{ return_route.decode_expr() }};
{%- elif return_route.is_packed() %}
    const packed = (_exports.{{ ffi_name }} as Function)({{ call_args }}) as bigint;
    const reader = _module.takePackedBuffer(packed);
    return {{ return_route.decode_expr() }};
{%- else %}
    const packed = (_exports.{{ ffi_name }} as Function)({{ call_args }}) as bigint;
    return {{ return_route.decode_expr() }};
{%- endif %}
  } finally {
    {{ cleanup_code }}
  }
{%- endif %}
}
