Các pbkdf2
chức năng có thực hiện hoạt Javascript nhưng nó thực sự đại biểu tất cả công việc phải làm để phía bên 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>);
tài nguyên: https://github.com/nodejs/node/blob/master/src/node_crypto.cc
Mô-đun Libuv có một trách nhiệm khác có liên quan đến một số chức năng rất đặc biệt trong thư viện tiêu chuẩn.
Đối với một số lệnh gọi hàm thư viện tiêu chuẩn, phía Node C ++ và Libuv quyết định thực hiện các phép tính đắt tiền bên ngoài vòng lặp sự kiện.
Thay vào đó, họ sử dụng một thứ gọi là nhóm luồng, nhóm luồng là một chuỗi gồm bốn luồng có thể được sử dụng để chạy các tác vụ tính toán đắt tiền như pbkdf2
hàm.
Theo mặc định, Libuv tạo ra 4 luồng trong nhóm luồng này.
Ngoài các luồng được sử dụng trong vòng lặp sự kiện, có bốn luồng khác có thể được sử dụng để giảm tải các tính toán đắt tiền cần phải xảy ra trong ứng dụng của chúng tôi.
Nhiều hàm trong thư viện chuẩn Node tự động sử dụng nhóm luồng này. Các pbkdf2
chức năng là một trong số họ.
Sự hiện diện của nhóm chủ đề này là rất đáng kể.
Vì vậy, Node không thực sự là một luồng đơn, bởi vì có các luồng khác mà Node sử dụng để thực hiện một số tác vụ tính toán tốn kém.
Nếu nhóm sự kiện chịu trách nhiệm thực hiện nhiệm vụ tính toán tốn kém, thì ứng dụng Node của chúng tôi không thể làm gì khác.
CPU của chúng tôi chạy tất cả các hướng dẫn bên trong một luồng một.
Bằng cách sử dụng nhóm luồng, chúng ta có thể thực hiện những việc khác trong vòng lặp sự kiện trong khi các phép tính đang diễn ra.