Die pbkdf2
Funktion verfügt über die JavaScript-Implementierung, delegiert jedoch die gesamte zu erledigende Arbeit an die C ++ - Seite.
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>);
Ressource: https://github.com/nodejs/node/blob/master/src/node_crypto.cc
Das Libuv-Modul hat eine weitere Verantwortung, die für einige ganz bestimmte Funktionen in der Standardbibliothek relevant ist.
Bei einigen Standard-Bibliotheksfunktionsaufrufen entscheiden sich die Node C ++ - Seite und Libuv dafür, teure Berechnungen vollständig außerhalb der Ereignisschleife durchzuführen.
Stattdessen verwenden sie einen sogenannten Thread-Pool. Der Thread-Pool besteht aus einer Reihe von vier Threads, mit denen rechenintensive Aufgaben wie die pbkdf2
Funktion ausgeführt werden können.
Standardmäßig erstellt Libuv 4 Threads in diesem Thread-Pool.
Zusätzlich zu den in der Ereignisschleife verwendeten Threads gibt es vier weitere Threads, mit denen teure Berechnungen ausgelagert werden können, die in unserer Anwendung ausgeführt werden müssen.
Viele der in der Node-Standardbibliothek enthaltenen Funktionen verwenden diesen Thread-Pool automatisch. Die pbkdf2
Funktion ist eine davon.
Das Vorhandensein dieses Thread-Pools ist sehr wichtig.
Node ist also kein Single-Thread, da es andere Threads gibt, die Node für einige rechenintensive Aufgaben verwendet.
Wenn der Ereignispool für die rechenintensive Aufgabe verantwortlich war, konnte unsere Knotenanwendung nichts anderes tun.
Unsere CPU führt alle Anweisungen einzeln in einem Thread aus.
Mithilfe des Thread-Pools können wir andere Dinge innerhalb einer Ereignisschleife ausführen, während Berechnungen durchgeführt werden.