11#include " io_agent.h"
22#include < algorithm>
3+ #include < iostream>
34#include < string>
5+ #include < string_view>
46#include " crdtp/dispatch.h"
5- #include " node_mutex .h"
7+ #include " inspector/network_resource_manager .h"
68
79namespace node ::inspector::protocol {
810
@@ -11,75 +13,67 @@ void IoAgent::Wire(UberDispatcher* dispatcher) {
1113 IO::Dispatcher::wire (dispatcher, this );
1214}
1315
14- std::unordered_map<int , int > IoAgent::offset_map_;
15- std::unordered_map<int , std::string> IoAgent::data_map_;
16- std::atomic<int > IoAgent::stream_counter_{1 };
17- Mutex IoAgent::data_mutex_;
18-
19- int IoAgent::setData (const std::string& value) {
20- int key = getNextStreamId ();
21- Mutex::ScopedLock lock (data_mutex_);
22- data_map_[key] = value;
23-
24- return key;
25- }
26-
27- int IoAgent::getNextStreamId () {
28- return stream_counter_++;
29- }
30-
3116DispatchResponse IoAgent::read (const String& in_handle,
3217 Maybe<int > in_offset,
3318 Maybe<int > in_size,
3419 String* out_data,
3520 bool * out_eof) {
36- Mutex::ScopedReadLock lock (data_mutex_);
3721 std::string in_handle_str = in_handle;
38- int stream_id = 0 ;
22+ uint64_t stream_id = 0 ;
3923 bool is_number =
4024 std::all_of (in_handle_str.begin (), in_handle_str.end (), ::isdigit);
4125 if (!is_number) {
42- out_data = new String ( " " ) ;
26+ * out_data = " " ;
4327 *out_eof = true ;
4428 return DispatchResponse::Success ();
4529 }
46- stream_id = std::stoi (in_handle_str);
30+ stream_id = std::stoull (in_handle_str);
31+
32+ std::string url = NetworkResourceManager::GetUrlForStreamId (stream_id);
33+ if (url.empty ()) {
34+ *out_data = " " ;
35+ *out_eof = true ;
36+ return DispatchResponse::Success ();
37+ }
38+ std::string txt = NetworkResourceManager::Get (url);
39+ std::string_view txt_view (txt);
4740
48- std::string txt = data_map_[stream_id];
4941 int offset = 0 ;
42+ bool offset_was_specified = false ;
5043 if (in_offset.isJust ()) {
5144 offset = in_offset.fromJust ();
45+ offset_was_specified = true ;
5246 } else if (offset_map_.find (stream_id) != offset_map_.end ()) {
5347 offset = offset_map_[stream_id];
5448 }
5549 int size = 1 << 20 ;
5650 if (in_size.isJust ()) {
5751 size = in_size.fromJust ();
5852 }
59-
60- if (static_cast <std::size_t >(offset) < txt.length ()) {
61- std::string out_txt = txt.substr (offset, size);
62- out_data->assign (out_txt);
53+ if (static_cast <std::size_t >(offset) < txt_view.length ()) {
54+ std::string_view out_view = txt_view.substr (offset, size);
55+ out_data->assign (out_view.data (), out_view.size ());
6356 *out_eof = false ;
57+ if (!offset_was_specified) {
58+ offset_map_[stream_id] = offset + size;
59+ }
6460 } else {
61+ *out_data = " " ;
6562 *out_eof = true ;
6663 }
6764
68- offset_map_[stream_id] = offset + size;
69-
7065 return DispatchResponse::Success ();
7166}
7267
7368DispatchResponse IoAgent::close (const String& in_handle) {
74- Mutex::ScopedWriteLock lock (data_mutex_);
7569 std::string in_handle_str = in_handle;
76- int stream_id = 0 ;
70+ uint64_t stream_id = 0 ;
7771 bool is_number =
7872 std::all_of (in_handle_str.begin (), in_handle_str.end (), ::isdigit);
7973 if (is_number) {
80- stream_id = std::stoi (in_handle_str);
81- offset_map_. erase (stream_id);
82- data_map_. erase (stream_id);
74+ stream_id = std::stoull (in_handle_str);
75+ // Use accessor to erase resource and mapping by stream id
76+ NetworkResourceManager::EraseByStreamId (stream_id);
8377 }
8478 return DispatchResponse::Success ();
8579}
0 commit comments