CCF
Loading...
Searching...
No Matches
registry.h
Go to the documentation of this file.
1// Copyright (c) Microsoft Corporation. All rights reserved.
2// Licensed under the Apache 2.0 License.
3#pragma once
4
5// CCF
6#include "ccf/app_interface.h"
7#include "ccf/endpoint.h"
9#include "ccf/js/bundle.h"
10#include "ccf/js/core/context.h"
13#include "ccf/tx.h"
14#include "ccf/tx_id.h"
15
16#include <charconv>
17#define FMT_HEADER_ONLY
18#include <fmt/format.h>
19
20namespace ccf::js
21{
24
25 // By subclassing DynamicJSEndpointRegistry, an application gains the
26 // ability to execute custom JavaScript endpoints, and exposes the ability to
27 // install them via install_custom_endpoints(). The JavaScript code for these
28 // endpoints is stored in the internal KV store under a namespace configured
29 // in the second argument to the constructor. Calling
30 // install_custom_endpoints() is logically equivalent to passing a set_js_app
31 // proposal in governance, and the payload format is currently identical,
32 // except the controlling logic resides in the application space.
33 //
34 // Known limitations:
35 //
36 // No auditability yet, COSE Sign1 auth is recommended, but the signature is
37 // not stored.
38 // No support for historical endpoints yet.
39 // No support for import from external modules.
40 //
41 // Additional functionality compared to set_js_app:
42 //
43 // The KV namespace can be private, to keep the application confidential if
44 // desired.
46 {
47 private:
48 std::shared_ptr<ccf::js::AbstractInterpreterCache> interpreter_cache =
49 nullptr;
50 std::string modules_map;
51 std::string metadata_map;
52 std::string interpreter_flush_map;
53 std::string modules_quickjs_version_map;
54 std::string modules_quickjs_bytecode_map;
55 std::string runtime_options_map;
56 std::string recent_actions_map;
57 std::string audit_input_map;
58 std::string audit_info_map;
59
60 ccf::js::NamespaceRestriction namespace_restriction;
61
62 using PreExecutionHook = std::function<void(ccf::js::core::Context&)>;
63
64 void do_execute_request(
65 const CustomJSEndpoint* endpoint,
67 const std::optional<PreExecutionHook>& pre_exec_hook = std::nullopt);
68
69 void execute_request(
70 const CustomJSEndpoint* endpoint,
72
73 void execute_request_locally_committed(
74 const CustomJSEndpoint* endpoint,
76 const ccf::TxID& tx_id);
77
78 public:
81 const std::string& kv_prefix = "public:custom_endpoints");
82
88 ccf::kv::Tx& tx, const ccf::js::Bundle& bundle);
89
98
105 const ccf::RESTVerb& verb,
106 const ccf::endpoints::URI& uri);
107
112 std::string& code,
114 const std::string& module_name);
115
120 const ccf::js::NamespaceRestriction& restriction);
121
127 ccf::kv::Tx& tx, const ccf::JSRuntimeOptions& options);
128
136
142 ccf::kv::Tx& tx,
143 ccf::ActionFormat format,
144 const std::string& user_id,
145 const std::string& action_name,
146 const std::vector<uint8_t>& action_body);
147
154 ccf::kv::Tx& tx,
155 uint64_t created_at,
156 const std::span<const uint8_t> action,
157 ccf::InvalidArgsReason& reason);
158
163 ccf::kv::Tx& tx, ccf::RpcContext& rpc_ctx) override;
164
165 void execute_endpoint(
167 ccf::endpoints::EndpointContext& endpoint_ctx) override;
168
172 const ccf::TxID& tx_id) override;
173
174 void build_api(nlohmann::json& document, ccf::kv::ReadOnlyTx& tx) override;
176
178 const ccf::endpoints::EndpointContext& endpoint_ctx)
179 {
180 return {};
181 };
182 };
183}
ccf::AbstractNodeContext & context
Definition base_endpoint_registry.h:123
Definition rest_verb.h:45
Describes the currently executing RPC.
Definition rpc_context.h:58
Definition app_interface.h:27
Definition registry.h:46
ccf::ApiResult get_js_runtime_options_v1(ccf::JSRuntimeOptions &options, ccf::kv::ReadOnlyTx &tx)
Definition registry.cpp:707
ccf::ApiResult get_custom_endpoint_module_v1(std::string &code, ccf::kv::ReadOnlyTx &tx, const std::string &module_name)
Definition registry.cpp:662
virtual ccf::js::extensions::Extensions get_extensions(const ccf::endpoints::EndpointContext &endpoint_ctx)
Definition registry.h:177
ccf::ApiResult check_action_not_replayed_v1(ccf::kv::Tx &tx, uint64_t created_at, const std::span< const uint8_t > action, ccf::InvalidArgsReason &reason)
Definition registry.cpp:886
ccf::ApiResult get_custom_endpoint_properties_v1(ccf::endpoints::EndpointProperties &properties, ccf::kv::ReadOnlyTx &tx, const ccf::RESTVerb &verb, const ccf::endpoints::URI &uri)
Definition registry.cpp:633
ccf::ApiResult install_custom_endpoints_v1(ccf::kv::Tx &tx, const ccf::js::Bundle &bundle)
Definition registry.cpp:508
void set_js_kv_namespace_restriction(const ccf::js::NamespaceRestriction &restriction)
Definition registry.cpp:687
ccf::ApiResult set_js_runtime_options_v1(ccf::kv::Tx &tx, const ccf::JSRuntimeOptions &options)
Definition registry.cpp:693
ccf::ApiResult get_custom_endpoints_v1(ccf::js::Bundle &bundle, ccf::kv::ReadOnlyTx &tx)
Definition registry.cpp:588
ccf::ApiResult record_action_for_audit_v1(ccf::kv::Tx &tx, ccf::ActionFormat format, const std::string &user_id, const std::string &action_name, const std::vector< uint8_t > &action_body)
Definition registry.cpp:956
Definition context.h:46
Definition tx.h:161
Definition tx.h:202
void execute_endpoint_locally_committed(ccf::endpoints::EndpointDefinitionPtr e, ccf::endpoints::CommandEndpointContext &endpoint_ctx, const ccf::TxID &tx_id) override
Definition registry.cpp:832
void execute_endpoint(ccf::endpoints::EndpointDefinitionPtr e, ccf::endpoints::EndpointContext &endpoint_ctx) override
Definition registry.cpp:817
ccf::endpoints::EndpointDefinitionPtr find_endpoint(ccf::kv::Tx &tx, ccf::RpcContext &rpc_ctx) override
Definition registry.cpp:725
void build_api(nlohmann::json &document, ccf::kv::ReadOnlyTx &tx) override
Definition registry.cpp:850
std::string URI
Definition endpoint.h:17
std::shared_ptr< const EndpointDefinition > EndpointDefinitionPtr
Definition endpoint.h:234
std::vector< ExtensionPtr > Extensions
Definition extension_interface.h:24
Definition bundle.h:12
std::function< KVAccessPermissions(const std::string &map_name, std::string &explanation)> NamespaceRestriction
Definition namespace_restrictions.h:16
InvalidArgsReason
Definition base_endpoint_registry.h:70
ApiResult
Definition base_endpoint_registry.h:18
ActionFormat
Definition audit_format.h:12
Definition node_context.h:12
Definition jsengine.h:12
Definition tx_id.h:44
Definition endpoint_context.h:24
Definition endpoint_context.h:55
Definition endpoint.h:161
Definition endpoint.h:253
Definition bundle.h:33
Definition registry.h:23