CCF
Loading...
Searching...
No Matches
context.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
9#include "ccf/js/tx_access.h"
10#include "ccf/pal/locking.h"
11
12#include <chrono>
13#include <quickjs/quickjs-exports.h>
14#include <quickjs/quickjs.h>
15#include <span>
16
17// Forward declarations
18namespace ccf
19{
20 class AbstractGovernanceEffects;
21 class AbstractHostProcesses;
22 struct NetworkState;
23 class RpcContext;
24 class BaseEndpointRegistry;
25
26 namespace historical
27 {
28 class AbstractStateCache;
29 struct State;
30
31 using StatePtr = std::shared_ptr<State>;
32 }
33}
34
35namespace ccf::js::core
36{
38 {
39 std::chrono::microseconds start_time;
40 std::chrono::milliseconds max_execution_time;
42 bool request_timed_out = false;
43 };
44
45 class Context
46 {
47 private:
48 JSContext* ctx;
49 Runtime rt;
50
52 js::modules::ModuleLoaderPtr module_loader;
53
54 // The interpreter can cache loaded modules so they do not need to be loaded
55 // from the KV for every execution, which is particularly useful when
56 // re-using interpreters. A module can only be loaded once per interpreter,
57 // and the entire interpreter should be thrown away if _any_ of its modules
58 // needs to be refreshed.
59 std::map<std::string, js::core::JSWrappedValue, std::less<>>
60 loaded_modules_cache;
61
62 public:
64
69
70 Context(TxAccess acc);
71
72 virtual ~Context();
73
74 // Delete copy and assignment operators, since this assumes sole ownership
75 // of underlying rt and ctx
76 Context(const Context&) = delete;
77 Context& operator=(const Context&) = delete;
78
80 {
81 return rt;
82 }
83
84 operator JSContext*() const
85 {
86 return ctx;
87 }
88
90 {
91 module_loader = ml;
92 }
93
94 virtual std::optional<JSWrappedValue> get_module(
95 std::string_view module_name);
96
97 // Construct RAII wrapper around raw QuickJS value
98 JSWrappedValue wrap(JSValue&& val) const;
99 JSWrappedValue wrap(const JSValue& x) const;
100
101 // If the first argument is a string-array, populates the second, and
102 // returns undefined. Otherwise returns a JS error value.
103 JSValue extract_string_array(
104 JSValueConst& argv, std::vector<std::string>& out);
105
106 std::pair<std::string, std::optional<std::string>> error_message();
107
108 // Getters
110 JSValue object, char const* property_name) const;
112 JSWrappedValue get_global_property(const char* s) const;
114 const char* s, JSWrappedValue default_value) const;
116 const JSWrappedValue& obj,
117 size_t* pbyte_offset,
118 size_t* pbyte_length,
119 size_t* pbytes_per_element) const;
121 const std::string& code,
122 const std::string& func,
123 const std::string& path);
125 const JSWrappedValue& module,
126 const std::string& func,
127 const std::string& path);
128
129 // Constant values
130 JSWrappedValue null() const;
132
133 // Construct new values
134 JSWrappedValue new_obj() const;
135 JSWrappedValue new_obj_class(JSClassID class_id) const;
138 const uint8_t* buf, size_t buf_len) const;
139 JSWrappedValue new_array_buffer_copy(const char* buf, size_t buf_len) const;
140 JSWrappedValue new_array_buffer_copy(std::span<const uint8_t> data) const;
141 JSWrappedValue new_string(const std::string_view& str) const;
142 JSWrappedValue new_string_len(const char* buf, size_t buf_len) const;
143 JSWrappedValue new_string_len(const std::span<const uint8_t> buf) const;
144 JSWrappedValue new_type_error(const char* fmt, ...) const;
145 JSWrappedValue new_internal_error(const char* fmt, ...) const;
146 JSWrappedValue new_tag_value(int tag, int32_t val = 0) const;
148 JSCFunction* func, const char* name, int length) const;
150 JSCFunction* func, const char* name, size_t arg_count = 0) const;
151
152 JSWrappedValue duplicate_value(JSValueConst original) const;
153
155 const char* input,
156 size_t input_len,
157 const char* filename,
158 int eval_flags) const;
160 const uint8_t* buf, size_t buf_len, int flags) const;
161
163 const JSWrappedValue& f,
164 const std::vector<JSWrappedValue>& argv,
165 const std::optional<ccf::JSRuntimeOptions>& options,
166 RuntimeLimitsPolicy policy);
167
168 // Call a JS function _without_ any stack, heap or execution time limits.
169 // Only to be used, as the name indicates, for calls inside an already
170 // invoked JS function, where the caller has already set up the necessary
171 // limits.
173 const JSWrappedValue& f, const std::vector<JSWrappedValue>& argv);
174
175 // JSON I/O
177 JSWrappedValue parse_json(const nlohmann::json& j) const;
179 const char* buf, size_t buf_len, const char* filename) const;
180
181 // Convert objects to string
182 std::optional<std::string> to_str(const JSWrappedValue& x) const;
183 std::optional<std::string> to_str(const JSValue& x) const;
184 std::optional<std::string> to_str(const JSValue& x, size_t& len) const;
185 std::optional<std::string> to_str(const JSAtom& atom) const;
186
187 void add_extension(const js::extensions::ExtensionPtr& extension);
188 bool remove_extension(const js::extensions::ExtensionPtr& extension);
189
190 template <typename TExtension>
191 TExtension* get_extension()
192 {
193 for (auto& extension : extensions)
194 {
195 if (TExtension* t = dynamic_cast<TExtension*>(extension.get());
196 t != nullptr)
197 {
198 return t;
199 }
200 }
201
202 return nullptr;
203 }
204 };
205}
Definition context.h:46
JSWrappedValue null() const
Definition context.cpp:316
JSWrappedValue new_c_function(JSCFunction *func, const char *name, int length) const
Definition context.cpp:404
JSWrappedValue get_exported_function(const std::string &code, const std::string &func, const std::string &path)
Definition context.cpp:255
bool remove_extension(const js::extensions::ExtensionPtr &extension)
Definition context.cpp:579
ccf::pal::Mutex lock
Definition context.h:63
JSWrappedValue get_global_obj() const
Definition context.cpp:220
void add_extension(const js::extensions::ExtensionPtr &extension)
Definition context.cpp:573
virtual std::optional< JSWrappedValue > get_module(std::string_view module_name)
Definition context.cpp:85
Context & operator=(const Context &)=delete
JSWrappedValue new_obj() const
Definition context.cpp:326
JSWrappedValue new_array_buffer_copy(const uint8_t *buf, size_t buf_len) const
Definition context.cpp:341
JSWrappedValue inner_call(const JSWrappedValue &f, const std::vector< JSWrappedValue > &argv)
Definition context.cpp:481
JSWrappedValue get_typed_array_buffer(const JSWrappedValue &obj, size_t *pbyte_offset, size_t *pbyte_length, size_t *pbytes_per_element) const
Definition context.cpp:245
bool log_execution_metrics
Definition context.h:68
JSWrappedValue undefined() const
Definition context.cpp:321
JSWrappedValue read_object(const uint8_t *buf, size_t buf_len, int flags) const
Definition context.cpp:431
const TxAccess access
Definition context.h:65
virtual ~Context()
Definition context.cpp:79
JSWrappedValue eval(const char *input, size_t input_len, const char *filename, int eval_flags) const
Definition context.cpp:422
JSWrappedValue new_internal_error(const char *fmt,...) const
Definition context.cpp:386
JSWrappedValue new_getter_c_function(JSCFunction *func, const char *name, size_t arg_count=0) const
Definition context.cpp:410
InterruptData interrupt_data
Definition context.h:66
JSValue extract_string_array(JSValueConst &argv, std::vector< std::string > &out)
Definition context.cpp:144
JSWrappedValue parse_json(const nlohmann::json &j) const
Definition context.cpp:508
JSWrappedValue new_type_error(const char *fmt,...) const
Definition context.cpp:377
JSWrappedValue new_tag_value(int tag, int32_t val=0) const
Definition context.cpp:395
std::optional< std::string > to_str(const JSWrappedValue &x) const
Definition context.cpp:520
JSWrappedValue new_string_len(const char *buf, size_t buf_len) const
Definition context.cpp:366
std::pair< std::string, std::optional< std::string > > error_message()
Definition context.cpp:187
JSWrappedValue get_property(JSValue object, char const *property_name) const
Definition context.cpp:214
JSWrappedValue new_string(const std::string_view &str) const
Definition context.cpp:361
bool implement_untrusted_time
Definition context.h:67
Context(const Context &)=delete
JSWrappedValue new_obj_class(JSClassID class_id) const
Definition context.cpp:331
JSWrappedValue json_stringify(const JSWrappedValue &obj) const
Definition context.cpp:499
JSWrappedValue duplicate_value(JSValueConst original) const
Definition context.cpp:417
Runtime & runtime()
Definition context.h:79
JSWrappedValue call_with_rt_options(const JSWrappedValue &f, const std::vector< JSWrappedValue > &argv, const std::optional< ccf::JSRuntimeOptions > &options, RuntimeLimitsPolicy policy)
Definition context.cpp:461
TExtension * get_extension()
Definition context.h:191
JSWrappedValue get_or_create_global_property(const char *s, JSWrappedValue default_value) const
Definition context.cpp:231
JSWrappedValue wrap(JSValue &&val) const
Definition context.cpp:134
JSWrappedValue new_array() const
Definition context.cpp:336
void set_module_loader(const modules::ModuleLoaderPtr &ml)
Definition context.h:89
JSWrappedValue get_global_property(const char *s) const
Definition context.cpp:225
Definition runtime.h:19
std::shared_ptr< State > StatePtr
Definition historical_queries_interface.h:41
Definition constants.h:8
RuntimeLimitsPolicy
Definition runtime.h:13
std::vector< ExtensionPtr > Extensions
Definition extension_interface.h:24
std::shared_ptr< ExtensionInterface > ExtensionPtr
Definition extension_interface.h:23
std::shared_ptr< ModuleLoaderInterface > ModuleLoaderPtr
Definition module_loader_interface.h:29
TxAccess
Definition tx_access.h:10
std::mutex Mutex
Definition locking.h:17
Definition app_interface.h:15
State
Definition http_parser.h:122
Definition context.h:38
ccf::js::TxAccess access
Definition context.h:41
std::chrono::microseconds start_time
Definition context.h:39
bool request_timed_out
Definition context.h:42
std::chrono::milliseconds max_execution_time
Definition context.h:40
Definition wrapped_value.h:13