Então, estou trabalhando em um nó customizado com muitas opções de configuração. Não é terrível complexo, apenas ocupado. Uma das coisas com a qual estou quebrando a cabeça é lidar com credenciais – basicamente, dadas quatro opções diferentes em dois conjuntos diferentes.
A primeira escolha que os usuários têm é se as credenciais são “codificadas” como um objeto de credencial (baseado em uma definição .credentials.ts) ou fornecidas dinamicamente nas propriedades do nó (definidas no arquivo .node.ts), para casos onde um único pipeline pode ser usado em um ambiente multi-site (permitindo que as credenciais sejam passadas dinamicamente de uma fonte segura; o “de onde” está além do meu escopo de influência, então essa pareceu ser a abordagem mais racional).
A segunda escolha é se eles fornecem um token de API diretamente ou fornecem uma senha que é usada para recuperar um token. Se o usuário fornecer um token, ele é apenas codificado e colocado em um cabeçalho Auth para qualquer requisição – sem problema. Mas se eles fornecerem uma senha, o nó precisa fazer uma requisição “especial” primeiro, com um cabeçalho Auth customizado contendo uma string codificada em base64 construída a partir do nome de usuário e da senha, e o token é retornado a partir disso.
Depois de ter avançado na implementação, percebi que tinha que lidar com muito disso manualmente, então o arquivo .credentials.ts apenas coleta dados (se o usuário seguir esse caminho) – assim como as entradas do nó. Tenho uma função apiRequest() definida e exportada a partir de um arquivo separado que lida com as requisições de API propriamente ditas, e uma função getApiToken() no mesmo arquivo (não exportada – é usada apenas por apiRequest() no momento) que especificamente lida com a requisição do token.
Os usuários podem escolher uma ou outra para uma ou outra. Independentemente disso, as entradas são as mesmas: nome de usuário, URL do site, e senha ou token de API. Eu já tinha tudo isso funcionando sem a opção de usar uma senha, mas comecei essa missão hoje, e consegui fazer funcionar com a opção de credenciais dinâmicas, mas parece que isso quebrou qualquer capacidade de puxar as credenciais da configuração baseada em .credentials.ts.
Apertei o problema em um bloco de código no arquivo .node.ts, que é apenas uma série de atribuições condicionais.
Primeiro, ele declara uma variável – credentials – e tenta usar getCredentials() para puxá-la da configuração .credentials.ts. Se não estiverem presentes, há uma captura de erro que simplesmente coloca credentials como undefined. Imediatamente depois, uma constante é declarada – dynamicConnection – que usa getNodeParameter() para obter as entradas das propriedades de entrada do nó (cada propriedade é type-safe, especificada como uma string) – então se nada estiver lá, elas são apenas null. Em seguida, um objeto connection é criado onde cada uma das quatro propriedades é atribuída com base em verificações condicionais das propriedades dos objetos credentials e dynamicConnection. Para cada uma, verificamos se o objeto credentials.<prop> contém uma string; se contiver, ela é atribuída, e se não, fazemos o mesmo para dynamicConnection. Se nenhuma contiver um valor string, a padrão é undefined. Finalmente, uma condição if() verifica para nos certificar de que temos (a) um nome de usuário, (b) uma URL de instância, e (c) uma senha ou um token; se qualquer uma dessas condições não for atendida, ela lança um erro. Essa condição if() é lida como “se NÃO nome de usuário -OU- NÃO URL de site -OU- ( NÃO token de api -E- NÃO senha): lance um erro.”
Isso funciona bem para a entrada dinâmica de credenciais, mas se eu tentar fazer isso com credenciais salvas, elas retornam o erro do bloco if(), como se algo estivesse faltando, mesmo sabendo que todos os campos estão lá. Criticamente – isso funcionava bem antes de eu adicionar a propriedade password ao connection, então genuinamente não acho que seja um problema de atribuição ou esperaria que tivesse falhado antes de implementar o campo de senha.
Sinto que estou perdendo algo absolutamente estúpido, mas espero que alguém aqui tenha mais clareza sobre isso do que eu tenho sozinho. Ou pelo menos que você possa confirmar que não estou louco? Por favor e obrigado!