CCF
Loading...
Searching...
No Matches
src
js
modules
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
5
#include "
ccf/js/modules/module_loader_interface.h
"
6
#include "
ccf/service/tables/modules.h
"
7
#include "
ccf/tx.h
"
8
#include "ccf/version.h"
9
10
#include <string>
11
12
namespace
ccf::js::modules
13
{
14
class
KvBytecodeModuleLoader
:
public
ModuleLoaderInterface
15
{
16
protected
:
17
ccf::ModulesQuickJsBytecode::ReadOnlyHandle*
modules_bytecode_handle
;
18
19
bool
version_ok
;
20
21
public
:
22
KvBytecodeModuleLoader
(
23
ccf::ModulesQuickJsBytecode::ReadOnlyHandle* mbh,
24
ccf::ModulesQuickJsVersion::ReadOnlyHandle* modules_version_handle) :
25
modules_bytecode_handle
(mbh)
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
{
31
CCF_APP_INFO
(
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
88
CCF_APP_TRACE
(
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
}
ccf::js::core::Context
Definition
context.h:46
ccf::js::core::Context::read_object
JSWrappedValue read_object(const uint8_t *buf, size_t buf_len, int flags) const
Definition
context.cpp:431
ccf::js::core::Context::error_message
std::pair< std::string, std::optional< std::string > > error_message()
Definition
context.cpp:187
ccf::js::core::Context::runtime
Runtime & runtime()
Definition
context.h:79
ccf::js::modules::KvBytecodeModuleLoader
Definition
kv_bytecode_module_loader.h:15
ccf::js::modules::KvBytecodeModuleLoader::KvBytecodeModuleLoader
KvBytecodeModuleLoader(ccf::ModulesQuickJsBytecode::ReadOnlyHandle *mbh, ccf::ModulesQuickJsVersion::ReadOnlyHandle *modules_version_handle)
Definition
kv_bytecode_module_loader.h:22
ccf::js::modules::KvBytecodeModuleLoader::version_ok
bool version_ok
Definition
kv_bytecode_module_loader.h:19
ccf::js::modules::KvBytecodeModuleLoader::get_module
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::js::modules::KvBytecodeModuleLoader::modules_bytecode_handle
ccf::ModulesQuickJsBytecode::ReadOnlyHandle * modules_bytecode_handle
Definition
kv_bytecode_module_loader.h:17
ccf::js::modules::ModuleLoaderInterface
Definition
module_loader_interface.h:21
CCF_APP_TRACE
#define CCF_APP_TRACE
Definition
logger.h:383
CCF_APP_INFO
#define CCF_APP_INFO
Definition
logger.h:399
CCF_APP_FAIL
#define CCF_APP_FAIL
Definition
logger.h:400
module_loader_interface.h
modules.h
ccf::js::modules
Definition
module_loader_interface.h:19
ccf::js::core::JSWrappedValue::is_exception
bool is_exception() const
Definition
wrapped_value.cpp:144
tx.h
Generated by
1.9.8