1
1
#include " io_agent.h"
2
2
#include < algorithm>
3
+ #include < iostream>
3
4
#include < string>
5
+ #include < string_view>
4
6
#include " crdtp/dispatch.h"
5
- #include " node_mutex .h"
7
+ #include " inspector/network_resource_manager .h"
6
8
7
9
namespace node ::inspector::protocol {
8
10
@@ -11,75 +13,67 @@ void IoAgent::Wire(UberDispatcher* dispatcher) {
11
13
IO::Dispatcher::wire (dispatcher, this );
12
14
}
13
15
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
-
31
16
DispatchResponse IoAgent::read (const String& in_handle,
32
17
Maybe<int > in_offset,
33
18
Maybe<int > in_size,
34
19
String* out_data,
35
20
bool * out_eof) {
36
- Mutex::ScopedReadLock lock (data_mutex_);
37
21
std::string in_handle_str = in_handle;
38
- int stream_id = 0 ;
22
+ uint64_t stream_id = 0 ;
39
23
bool is_number =
40
24
std::all_of (in_handle_str.begin (), in_handle_str.end (), ::isdigit);
41
25
if (!is_number) {
42
- out_data = new String ( " " ) ;
26
+ * out_data = " " ;
43
27
*out_eof = true ;
44
28
return DispatchResponse::Success ();
45
29
}
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);
47
40
48
- std::string txt = data_map_[stream_id];
49
41
int offset = 0 ;
42
+ bool offset_was_specified = false ;
50
43
if (in_offset.isJust ()) {
51
44
offset = in_offset.fromJust ();
45
+ offset_was_specified = true ;
52
46
} else if (offset_map_.find (stream_id) != offset_map_.end ()) {
53
47
offset = offset_map_[stream_id];
54
48
}
55
49
int size = 1 << 20 ;
56
50
if (in_size.isJust ()) {
57
51
size = in_size.fromJust ();
58
52
}
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 ());
63
56
*out_eof = false ;
57
+ if (!offset_was_specified) {
58
+ offset_map_[stream_id] = offset + size;
59
+ }
64
60
} else {
61
+ *out_data = " " ;
65
62
*out_eof = true ;
66
63
}
67
64
68
- offset_map_[stream_id] = offset + size;
69
-
70
65
return DispatchResponse::Success ();
71
66
}
72
67
73
68
DispatchResponse IoAgent::close (const String& in_handle) {
74
- Mutex::ScopedWriteLock lock (data_mutex_);
75
69
std::string in_handle_str = in_handle;
76
- int stream_id = 0 ;
70
+ uint64_t stream_id = 0 ;
77
71
bool is_number =
78
72
std::all_of (in_handle_str.begin (), in_handle_str.end (), ::isdigit);
79
73
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);
83
77
}
84
78
return DispatchResponse::Success ();
85
79
}
0 commit comments