Ця pbkdf2
функція має реалізацію JavaScript, але вона фактично делегує всю роботу, яку потрібно виконати стороні 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>);
ресурс: https://github.com/nodejs/node/blob/master/src/node_crypto.cc
Модуль Libuv несе ще одну відповідальність, що стосується деяких особливо функцій у стандартній бібліотеці.
Для деяких стандартних викликів функцій бібліотеки сторона Node C ++ та Libuv вирішують повністю робити дорогі обчислення поза циклом подій.
Замість цього вони використовують щось, що називається пул потоків, пул потоків - це серія з чотирьох потоків, які можна використовувати для виконання обчислювально дорогих завдань, таких як pbkdf2
функція.
За замовчуванням Libuv створює 4 потоки в цьому пулі потоків.
На додаток до потоків, що використовуються в циклі подій, є ще чотири потоки, які можна використовувати для завантаження дорогих розрахунків, які необхідно здійснити всередині нашого додатку.
Багато функцій, включених у стандартну бібліотеку Node, автоматично використовують цей пул потоків. pbkdf2
Функція є однією з них.
Наявність цього пулу ниток дуже важливе.
Таким чином, Node не є справді однопоточним, оскільки є інші потоки, які Node використовує для виконання деяких обчислювально дорогих завдань.
Якщо пул подій відповідав за виконання обчислювально дорогого завдання, то наш додаток Node не міг би нічого іншого.
Наш процесор виконує всі інструкції всередині потоку по черзі.
Використовуючи пул потоків, ми можемо робити інші речі всередині циклу події під час проведення розрахунків.