CCF
Loading...
Searching...
No Matches
kv_bytecode_module_loader.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
7#include "ccf/tx.h"
8#include "ccf/version.h"
9
10#include <string>
11
12namespace ccf::js::modules
13{
15 {
16 protected:
17 ccf::ModulesQuickJsBytecode::ReadOnlyHandle* modules_bytecode_handle;
18
20
21 public:
23 ccf::ModulesQuickJsBytecode::ReadOnlyHandle* mbh,
24 ccf::ModulesQuickJsVersion::ReadOnlyHandle* modules_version_handle) :
26 {
27 const auto version_in_kv = modules_version_handle->get();
28 const auto version_in_binary = std::string(ccf::quickjs_version);
29 if (version_in_kv != version_in_binary)
30 {
32 "Ignoring bytecode table, which was written for QuickJS {} (this "
33 "node is running QuickJS {})",
34 version_in_kv,
35 version_in_binary);
36 version_ok = false;
37 }
38 else
39 {
40 version_ok = true;
41 }
42 }
43
44 virtual std::optional<js::core::JSWrappedValue> get_module(
45 std::string_view module_name, js::core::Context& ctx) override
46 {
47 if (!version_ok)
48 {
49 return std::nullopt;
50 }
51
52 std::string module_name_kv(module_name);
53 if (module_name_kv[0] != '/')
54 {
55 module_name_kv.insert(0, "/");
56 }
57
58 CCF_APP_TRACE("Looking for module '{}' bytecode in KV", module_name_kv);
59
60 auto module_bytecode = modules_bytecode_handle->get(module_name_kv);
61 if (!module_bytecode.has_value())
62 {
63 CCF_APP_TRACE("Module '{}' not found", module_name_kv);
64 return std::nullopt;
65 }
66
67 auto module_val = ctx.read_object(
68 module_bytecode->data(), module_bytecode->size(), JS_READ_OBJ_BYTECODE);
69
70 const bool failed_deser = module_val.is_exception();
71
72 if (failed_deser)
73 {
74 auto [reason, trace] = ctx.error_message();
75
76 auto& rt = ctx.runtime();
77 if (rt.log_exception_details)
78 {
79 CCF_APP_FAIL("{}: {}", reason, trace.value_or("<no trace>"));
80 }
81
82 throw std::runtime_error(fmt::format(
83 "Failed to deserialize bytecode for module '{}': {}",
84 module_name,
85 reason));
86 }
87
89 "Module '{}' bytecode found in KV (table: {})",
90 module_name_kv,
91 modules_bytecode_handle->get_name_of_map());
92 return module_val;
93 }
94 };
95}
Definition context.h:46
JSWrappedValue read_object(const uint8_t *buf, size_t buf_len, int flags) const
Definition context.cpp:431
std::pair< std::string, std::optional< std::string > > error_message()
Definition context.cpp:187
Runtime & runtime()
Definition context.h:79
Definition kv_bytecode_module_loader.h:15
KvBytecodeModuleLoader(ccf::ModulesQuickJsBytecode::ReadOnlyHandle *mbh, ccf::ModulesQuickJsVersion::ReadOnlyHandle *modules_version_handle)
Definition kv_bytecode_module_loader.h:22
bool version_ok
Definition kv_bytecode_module_loader.h:19
virtual std::optional< js::core::JSWrappedValue > get_module(std::string_view module_name, js::core::Context &ctx) override
Definition kv_bytecode_module_loader.h:44
ccf::ModulesQuickJsBytecode::ReadOnlyHandle * modules_bytecode_handle
Definition kv_bytecode_module_loader.h:17
Definition module_loader_interface.h:21
#define CCF_APP_TRACE
Definition logger.h:383
#define CCF_APP_INFO
Definition logger.h:399
#define CCF_APP_FAIL
Definition logger.h:400
Definition module_loader_interface.h:19
bool is_exception() const
Definition wrapped_value.cpp:144