A pbkdf2
função possui a implementação JavaScript, mas na verdade delega todo o trabalho a ser feito no lado do C ++.
env->SetMethod(target, "pbkdf2", PBKDF2);
env->SetMethod(target, "generateKeyPairRSA", GenerateKeyPairRSA);
env->SetMethod(target, "generateKeyPairDSA", GenerateKeyPairDSA);
env->SetMethod(target, "generateKeyPairEC", GenerateKeyPairEC);
NODE_DEFINE_CONSTANT(target, OPENSSL_EC_NAMED_CURVE);
NODE_DEFINE_CONSTANT(target, OPENSSL_EC_EXPLICIT_CURVE);
NODE_DEFINE_CONSTANT(target, kKeyEncodingPKCS1);
NODE_DEFINE_CONSTANT(target, kKeyEncodingPKCS8);
NODE_DEFINE_CONSTANT(target, kKeyEncodingSPKI);
NODE_DEFINE_CONSTANT(target, kKeyEncodingSEC1);
NODE_DEFINE_CONSTANT(target, kKeyFormatDER);
NODE_DEFINE_CONSTANT(target, kKeyFormatPEM);
NODE_DEFINE_CONSTANT(target, kKeyTypeSecret);
NODE_DEFINE_CONSTANT(target, kKeyTypePublic);
NODE_DEFINE_CONSTANT(target, kKeyTypePrivate);
env->SetMethod(target, "randomBytes", RandomBytes);
env->SetMethodNoSideEffect(target, "timingSafeEqual", TimingSafeEqual);
env->SetMethodNoSideEffect(target, "getSSLCiphers", GetSSLCiphers);
env->SetMethodNoSideEffect(target, "getCiphers", GetCiphers);
env->SetMethodNoSideEffect(target, "getHashes", GetHashes);
env->SetMethodNoSideEffect(target, "getCurves", GetCurves);
env->SetMethod(target, "publicEncrypt",
PublicKeyCipher::Cipher<PublicKeyCipher::kPublic,
EVP_PKEY_encrypt_init,
EVP_PKEY_encrypt>);
env->SetMethod(target, "privateDecrypt",
PublicKeyCipher::Cipher<PublicKeyCipher::kPrivate,
EVP_PKEY_decrypt_init,
EVP_PKEY_decrypt>);
env->SetMethod(target, "privateEncrypt",
PublicKeyCipher::Cipher<PublicKeyCipher::kPrivate,
EVP_PKEY_sign_init,
EVP_PKEY_sign>);
env->SetMethod(target, "publicDecrypt",
PublicKeyCipher::Cipher<PublicKeyCipher::kPublic,
EVP_PKEY_verify_recover_init,
EVP_PKEY_verify_recover>);
recurso: https://github.com/nodejs/node/blob/master/src/node_crypto.cc
O módulo Libuv tem outra responsabilidade que é relevante para algumas funções muito particulares na biblioteca padrão.
Para algumas chamadas de função de biblioteca padrão, o lado do Node C ++ e o Libuv decidem fazer cálculos caros fora do loop de eventos completamente.
Em vez disso, eles usam algo chamado pool de threads, o pool de threads é uma série de quatro threads que podem ser usados para executar tarefas computacionalmente caras, como a pbkdf2
função.
Por padrão, o Libuv cria 4 threads neste pool de threads.
Além dos encadeamentos usados no loop de eventos, existem outros quatro encadeamentos que podem ser usados para descarregar cálculos dispendiosos que precisam ocorrer dentro de nosso aplicativo.
Muitas das funções incluídas na biblioteca padrão do Nó usam automaticamente esse conjunto de encadeamentos. A pbkdf2
função é uma delas.
A presença desse conjunto de encadeamentos é muito significativa.
Portanto, o Node não é verdadeiramente único, porque existem outros segmentos que o Node usa para realizar algumas tarefas caras em termos de computação.
Se o pool de eventos fosse responsável por executar a tarefa computacionalmente cara, nosso aplicativo Node não poderia fazer mais nada.
Nossa CPU executa todas as instruções dentro de um thread, uma por uma.
Usando o pool de threads, podemos fazer outras coisas dentro de um loop de eventos enquanto os cálculos estão ocorrendo.