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{
22 static constexpr auto default_js_registry_kv_prefix =
23 "public:custom_endpoints";
24
27
28 // By subclassing BaseDynamicJSEndpointRegistry, an application gains the
29 // ability to execute custom JavaScript endpoints, and exposes the ability to
30 // install them via install_custom_endpoints(). The JavaScript code for these
31 // endpoints is stored in the internal KV store under a namespace configured
32 // in the second argument to the constructor. Calling
33 // install_custom_endpoints() is logically equivalent to passing a set_js_app
34 // proposal in governance, and the payload format is currently identical,
35 // except the controlling logic resides in the application space.
36 //
37 // Additional functionality compared to set_js_app:
38 // - The KV namespace can be private, to keep the application confidential if
39 // desired.
41 {
42 private:
43 std::shared_ptr<ccf::js::AbstractInterpreterCache> interpreter_cache =
44 nullptr;
45
46 ccf::js::NamespaceRestriction namespace_restriction;
47
48 using PreExecutionHook = std::function<void(ccf::js::core::Context&)>;
49
50 void do_execute_request(
51 const CustomJSEndpoint* endpoint,
53 const std::optional<PreExecutionHook>& pre_exec_hook = std::nullopt);
54
55 void execute_request(
56 const CustomJSEndpoint* endpoint,
58
59 void execute_request_locally_committed(
60 const CustomJSEndpoint* endpoint,
62 const ccf::TxID& tx_id);
63
64 protected:
65 std::string modules_map;
66 std::string metadata_map;
71
72 public:
75 const std::string& kv_prefix = default_js_registry_kv_prefix);
76
82 ccf::kv::Tx& tx, const ccf::js::Bundle& bundle);
83
92
99 const ccf::RESTVerb& verb,
100 const ccf::endpoints::URI& uri);
101
106 std::string& code,
108 const std::string& module_name);
109
114 const ccf::js::NamespaceRestriction& restriction);
115
121 ccf::kv::Tx& tx, const ccf::JSRuntimeOptions& options);
122
134 ccf::kv::Tx& tx, ccf::RpcContext& rpc_ctx) override;
135
136 void execute_endpoint(
138 ccf::endpoints::EndpointContext& endpoint_ctx) override;
139
143 const ccf::TxID& tx_id) override;
144
145 void build_api(nlohmann::json& document, ccf::kv::ReadOnlyTx& tx) override;
146
147 std::set<RESTVerb> get_allowed_verbs(
148 ccf::kv::Tx&, const ccf::RpcContext& rpc_ctx) override;
150
152 const ccf::endpoints::EndpointContext& endpoint_ctx)
153 {
154 return {};
155 };
156 };
157
158 // Extends BaseDynamicJSEndpointRegistry with methods for making actions
159 // auditable and preventing replay. These should be used if apps are not
160 // deployed through governance, to ensure that app-modification is safely and
161 // clearly tracked in the ledger history
163 {
164 protected:
166 std::string audit_input_map;
167 std::string audit_info_map;
168
169 public:
172 const std::string& kv_prefix = default_js_registry_kv_prefix) :
174 recent_actions_map(fmt::format("{}.recent_actions", kv_prefix)),
175 audit_input_map(fmt::format("{}.audit.input", kv_prefix)),
176 audit_info_map(fmt::format("{}.audit.info", kv_prefix))
177 {}
178
184 ccf::kv::Tx& tx,
185 ccf::ActionFormat format,
186 const std::string& user_id,
187 const std::string& action_name,
188 const std::vector<uint8_t>& action_body);
189
196 ccf::kv::Tx& tx,
197 uint64_t created_at,
198 const std::span<const uint8_t> action,
199 ccf::InvalidArgsReason& reason);
200 };
201}
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:26
virtual ccf::js::extensions::Extensions get_extensions(const ccf::endpoints::EndpointContext &endpoint_ctx)
Definition registry.h:151
ccf::ApiResult install_custom_endpoints_v1(ccf::kv::Tx &tx, const ccf::js::Bundle &bundle)
Definition registry.cpp:538
ccf::ApiResult set_js_runtime_options_v1(ccf::kv::Tx &tx, const ccf::JSRuntimeOptions &options)
Definition registry.cpp:720
std::string interpreter_flush_map
Definition registry.h:67
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:664
std::string modules_quickjs_bytecode_map
Definition registry.h:69
std::string runtime_options_map
Definition registry.h:70
std::string modules_map
Definition registry.h:65
ccf::ApiResult get_custom_endpoints_v1(ccf::js::Bundle &bundle, ccf::kv::ReadOnlyTx &tx)
Definition registry.cpp:618
void set_js_kv_namespace_restriction(const ccf::js::NamespaceRestriction &restriction)
Definition registry.cpp:714
ccf::ApiResult get_js_runtime_options_v1(ccf::JSRuntimeOptions &options, ccf::kv::ReadOnlyTx &tx)
Definition registry.cpp:734
ccf::ApiResult get_custom_endpoint_module_v1(std::string &code, ccf::kv::ReadOnlyTx &tx, const std::string &module_name)
Definition registry.cpp:691
std::string metadata_map
Definition registry.h:66
std::string modules_quickjs_version_map
Definition registry.h:68
Definition registry.h:163
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:948
std::string audit_input_map
Definition registry.h:166
DynamicJSEndpointRegistry(ccf::AbstractNodeContext &context, const std::string &kv_prefix=default_js_registry_kv_prefix)
Definition registry.h:170
std::string recent_actions_map
Definition registry.h:165
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:1018
std::string audit_info_map
Definition registry.h:167
Definition context.h:46
Definition tx.h:160
Definition tx.h:201
ccf::endpoints::EndpointDefinitionPtr find_endpoint(ccf::kv::Tx &tx, ccf::RpcContext &rpc_ctx) override
Definition registry.cpp:752
void build_api(nlohmann::json &document, ccf::kv::ReadOnlyTx &tx) override
Definition registry.cpp:877
void execute_endpoint_locally_committed(ccf::endpoints::EndpointDefinitionPtr e, ccf::endpoints::CommandEndpointContext &endpoint_ctx, const ccf::TxID &tx_id) override
Definition registry.cpp:859
std::set< RESTVerb > get_allowed_verbs(ccf::kv::Tx &, const ccf::RpcContext &rpc_ctx) override
Definition registry.cpp:913
void execute_endpoint(ccf::endpoints::EndpointDefinitionPtr e, ccf::endpoints::EndpointContext &endpoint_ctx) override
Definition registry.cpp:844
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:26