La pbkdf2
funzione ha l'implementazione JavaScript ma in realtà delega tutto il lavoro da eseguire sul lato 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>);
risorsa: https://github.com/nodejs/node/blob/master/src/node_crypto.cc
Il modulo Libuv ha un'altra responsabilità che è rilevante per alcune funzioni molto particolari nella libreria standard.
Per alcune chiamate di funzione di libreria standard, il lato C ++ del nodo e Libuv decidono di eseguire calcoli costosi al di fuori del ciclo degli eventi.
Invece fanno uso di qualcosa chiamato pool di thread, il pool di thread è una serie di quattro thread che possono essere utilizzati per eseguire attività costose dal punto di vista computazionale come la pbkdf2
funzione.
Di default Libuv crea 4 thread in questo pool di thread.
Oltre ai thread utilizzati nel loop degli eventi, ci sono altri quattro thread che possono essere utilizzati per scaricare calcoli costosi che devono avvenire all'interno della nostra applicazione.
Molte delle funzioni incluse nella libreria standard Node utilizzano automaticamente questo pool di thread. La pbkdf2
funzione è una di queste.
La presenza di questo pool di thread è molto significativa.
Quindi Node non è veramente single thread, perché ci sono altri thread che Node utilizza per svolgere alcune attività computazionalmente costose.
Se il pool di eventi fosse responsabile dell'esecuzione di un'attività computazionalmente costosa, la nostra applicazione Node non potrebbe fare nient'altro.
La nostra CPU esegue tutte le istruzioni all'interno di un thread una per una.
Usando il pool di thread possiamo fare altre cose all'interno di un loop di eventi mentre si verificano calcoli.