pbkdf2
Funkcja ma wdrożenie JavaScript ale faktycznie delegaci wszystkich do zrobienia w C ++ stronie.
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>);
zasób: https://github.com/nodejs/node/blob/master/src/node_crypto.cc
Moduł Libuv ma inną odpowiedzialność, która jest istotna dla niektórych bardzo szczególnych funkcji w bibliotece standardowej.
W przypadku niektórych wywołań funkcji biblioteki standardowej strona Node C ++ i Libuv decydują się całkowicie na wykonanie kosztownych obliczeń poza pętlą zdarzeń.
Zamiast tego używają czegoś, co nazywa się pulą wątków, pula wątków to seria czterech wątków, których można używać do wykonywania zadań wymagających dużej mocy obliczeniowej, takich jak pbkdf2
funkcja.
Domyślnie Libuv tworzy 4 wątki w tej puli wątków.
Oprócz wątków używanych w pętli zdarzeń istnieją cztery inne wątki, których można użyć do odciążenia kosztownych obliczeń, które muszą być wykonywane w naszej aplikacji.
Wiele funkcji zawartych w standardowej bibliotece Node automatycznie korzysta z tej puli wątków. pbkdf2
Funkcja jest jednym z nich.
Obecność tej puli wątków jest bardzo znacząca.
Tak więc Node nie jest naprawdę jednowątkowy, ponieważ istnieją inne wątki, których Node używa do wykonywania niektórych zadań wymagających dużej mocy obliczeniowej.
Gdyby pula zdarzeń była odpowiedzialna za wykonanie kosztownego obliczeniowo zadania, nasza aplikacja Node nie mogła zrobić nic innego.
Nasz procesor uruchamia wszystkie instrukcje w wątku jeden po drugim.
Korzystając z puli wątków, możemy robić inne rzeczy wewnątrz pętli zdarzeń podczas wykonywania obliczeń.