mirror of
https://github.com/ading2210/libcurl.js.git
synced 2025-05-13 14:30:02 -04:00
create session class and refactor js to use it
This commit is contained in:
parent
a282734c13
commit
0a5ace96fb
14 changed files with 359 additions and 192 deletions
98
client/javascript/session.js
Normal file
98
client/javascript/session.js
Normal file
|
@ -0,0 +1,98 @@
|
|||
class CurlSession {
|
||||
constructor(options={}) {
|
||||
check_loaded(true);
|
||||
|
||||
this.options = options;
|
||||
this.session_ptr = _session_create();
|
||||
this.active_requests = 0;
|
||||
this.event_loop = null;
|
||||
this.requests_list = [];
|
||||
}
|
||||
|
||||
assert_ready() {
|
||||
if (!this.session_ptr) {
|
||||
throw "session has been removed";
|
||||
}
|
||||
}
|
||||
|
||||
set_connections(connections_limit, cache_limit) {
|
||||
this.assert_ready();
|
||||
_session_set_options(this.session_ptr, connections_limit, cache_limit);
|
||||
}
|
||||
|
||||
create_request(url, js_data_callback, js_end_callback, js_headers_callback) {
|
||||
this.assert_ready();
|
||||
let end_callback_ptr;
|
||||
let data_callback_ptr;
|
||||
let headers_callback_ptr;
|
||||
|
||||
let end_callback = (error) => {
|
||||
Module.removeFunction(end_callback_ptr);
|
||||
Module.removeFunction(data_callback_ptr);
|
||||
Module.removeFunction(headers_callback_ptr);
|
||||
|
||||
this.active_requests--;
|
||||
js_end_callback(error);
|
||||
}
|
||||
|
||||
let data_callback = (chunk_ptr, chunk_size) => {
|
||||
let data = Module.HEAPU8.subarray(chunk_ptr, chunk_ptr + chunk_size);
|
||||
let chunk = new Uint8Array(data);
|
||||
js_data_callback(chunk);
|
||||
}
|
||||
|
||||
let headers_callback = () => {
|
||||
js_headers_callback();
|
||||
}
|
||||
|
||||
end_callback_ptr = Module.addFunction(end_callback, "vi");
|
||||
headers_callback_ptr = Module.addFunction(headers_callback, "v");
|
||||
data_callback_ptr = Module.addFunction(data_callback, "vii");
|
||||
let request_ptr = c_func(_create_request, [url, data_callback_ptr, end_callback_ptr, headers_callback_ptr]);
|
||||
|
||||
return request_ptr;
|
||||
}
|
||||
|
||||
remove_request(request_ptr) {
|
||||
this.assert_ready();
|
||||
_session_remove_request(this.session_ptr, request_ptr);
|
||||
|
||||
let request_index = this.requests_list.indexOf(request_ptr);
|
||||
if (request_index !== -1) {
|
||||
this.requests_list.splice(request_index, 1);
|
||||
}
|
||||
}
|
||||
|
||||
start_request(request_ptr) {
|
||||
this.assert_ready();
|
||||
_session_add_request(this.session_ptr, request_ptr);
|
||||
_session_perform(this.session_ptr);
|
||||
|
||||
this.active_requests++;
|
||||
this.requests_list.push(request_ptr);
|
||||
|
||||
if (this.event_loop) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.event_loop = setInterval(() => {
|
||||
let libcurl_active = _session_get_active(this.session_ptr);
|
||||
if (libcurl_active || this.active_requests) {
|
||||
_session_perform(this.session_ptr);
|
||||
}
|
||||
else {
|
||||
clearInterval(this.event_loop);
|
||||
this.event_loop = null;
|
||||
}
|
||||
}, 0);
|
||||
}
|
||||
|
||||
close() {
|
||||
this.assert_ready();
|
||||
for (let request_ptr of this.requests_list) {
|
||||
this.remove_request(request_ptr);
|
||||
}
|
||||
_session_cleanup(this.session_ptr);
|
||||
this.session_ptr = null;
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue