@ugo-studio/jspp 0.2.9 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/dist/core/codegen/class-handlers.js +6 -6
  2. package/dist/core/codegen/statement-handlers.js +1 -1
  3. package/package.json +1 -1
  4. package/src/prelude/any_value.hpp +362 -362
  5. package/src/prelude/any_value_access.hpp +170 -170
  6. package/src/prelude/any_value_defines.hpp +189 -189
  7. package/src/prelude/any_value_helpers.hpp +374 -374
  8. package/src/prelude/library/array.hpp +185 -185
  9. package/src/prelude/library/console.hpp +111 -111
  10. package/src/prelude/library/error.hpp +112 -112
  11. package/src/prelude/library/function.hpp +10 -10
  12. package/src/prelude/library/math.hpp +307 -307
  13. package/src/prelude/library/object.hpp +275 -275
  14. package/src/prelude/library/process.hpp +39 -39
  15. package/src/prelude/library/promise.hpp +123 -123
  16. package/src/prelude/library/symbol.hpp +52 -52
  17. package/src/prelude/library/timer.hpp +91 -91
  18. package/src/prelude/types.hpp +178 -178
  19. package/src/prelude/utils/access.hpp +411 -411
  20. package/src/prelude/utils/operators.hpp +336 -336
  21. package/src/prelude/values/array.hpp +0 -1
  22. package/src/prelude/values/async_iterator.hpp +83 -83
  23. package/src/prelude/values/function.hpp +82 -82
  24. package/src/prelude/values/helpers/array.hpp +198 -208
  25. package/src/prelude/values/helpers/async_iterator.hpp +275 -275
  26. package/src/prelude/values/helpers/function.hpp +108 -108
  27. package/src/prelude/values/helpers/iterator.hpp +144 -144
  28. package/src/prelude/values/helpers/promise.hpp +253 -253
  29. package/src/prelude/values/helpers/string.hpp +37 -61
  30. package/src/prelude/values/promise.hpp +72 -72
  31. package/src/prelude/values/prototypes/array.hpp +14 -2
  32. package/src/prelude/values/prototypes/iterator.hpp +201 -201
  33. package/src/prelude/values/prototypes/promise.hpp +196 -196
  34. package/src/prelude/values/prototypes/string.hpp +564 -542
  35. package/src/prelude/values/string.hpp +25 -26
@@ -1,123 +1,123 @@
1
- #pragma once
2
-
3
- #include "types.hpp"
4
- #include "values/promise.hpp"
5
- #include "any_value.hpp"
6
- #include "exception.hpp"
7
-
8
- inline auto Promise = jspp::AnyValue::make_function([](jspp::AnyValue thisVal, std::span<const jspp::AnyValue> args) -> jspp::AnyValue
9
- {
10
- if (args.empty() || !args[0].is_function())
11
- {
12
- throw jspp::Exception::make_exception("Promise resolver undefined is not a function", "TypeError");
13
- }
14
- auto executor = args[0].as_function();
15
-
16
- jspp::JsPromise promise;
17
- auto state = promise.state; // Share state
18
-
19
- // resolve function
20
- auto resolveFn = jspp::AnyValue::make_function([state](jspp::AnyValue, std::span<const jspp::AnyValue> args) -> jspp::AnyValue
21
- {
22
- jspp::JsPromise p; p.state = state;
23
- p.resolve(args.empty() ? jspp::Constants::UNDEFINED : args[0]);
24
- return jspp::Constants::UNDEFINED; }, "resolve");
25
-
26
- // reject function
27
- auto rejectFn = jspp::AnyValue::make_function([state](jspp::AnyValue, std::span<const jspp::AnyValue> args) -> jspp::AnyValue
28
- {
29
- jspp::JsPromise p; p.state = state;
30
- p.reject(args.empty() ? jspp::Constants::UNDEFINED : args[0]);
31
- return jspp::Constants::UNDEFINED; }, "reject");
32
-
33
- try
34
- {
35
- const jspp::AnyValue executorArgs[] = {resolveFn, rejectFn};
36
- executor->call(jspp::Constants::UNDEFINED, std::span<const jspp::AnyValue>(executorArgs, 2));
37
- }
38
- catch (const jspp::Exception &e)
39
- {
40
- promise.reject(e.data);
41
- }
42
- catch (...)
43
- {
44
- promise.reject(jspp::AnyValue::make_string("Unknown error during Promise execution"));
45
- }
46
-
47
- return jspp::AnyValue::make_promise(promise); },
48
- "Promise");
49
-
50
- struct PromiseInit
51
- {
52
- PromiseInit()
53
- {
54
- // Promise.resolve(value)
55
- Promise.define_data_property("resolve", jspp::AnyValue::make_function([](jspp::AnyValue, std::span<const jspp::AnyValue> args) -> jspp::AnyValue
56
- {
57
- jspp::JsPromise p;
58
- p.resolve(args.empty() ? jspp::Constants::UNDEFINED : args[0]);
59
- return jspp::AnyValue::make_promise(p); }, "resolve"));
60
-
61
- // Promise.reject(reason)
62
- Promise.define_data_property("reject", jspp::AnyValue::make_function([](jspp::AnyValue, std::span<const jspp::AnyValue> args) -> jspp::AnyValue
63
- {
64
- jspp::JsPromise p;
65
- p.reject(args.empty() ? jspp::Constants::UNDEFINED : args[0]);
66
- return jspp::AnyValue::make_promise(p); }, "reject"));
67
-
68
- // Promise.all(iterable)
69
- Promise.define_data_property("all", jspp::AnyValue::make_function([](jspp::AnyValue, std::span<const jspp::AnyValue> args) -> jspp::AnyValue
70
- {
71
- // Handle non-array iterable or empty args
72
- if (args.empty() || !args[0].is_array()) {
73
- jspp::JsPromise p; p.reject(jspp::AnyValue::make_string("Promise.all argument must be an array"));
74
- return jspp::AnyValue::make_promise(p);
75
- }
76
-
77
- auto arr = args[0].as_array();
78
- size_t len = static_cast<size_t>(arr->length);
79
- if (len == 0) {
80
- jspp::JsPromise p; p.resolve(jspp::AnyValue::make_array(std::vector<jspp::AnyValue>()));
81
- return jspp::AnyValue::make_promise(p);
82
- }
83
-
84
- jspp::JsPromise masterPromise;
85
- auto masterState = masterPromise.state;
86
-
87
- auto results = std::make_shared<std::vector<jspp::AnyValue>>(len, jspp::Constants::UNDEFINED);
88
- auto count = std::make_shared<size_t>(len);
89
-
90
- // Check if already rejected to avoid further processing
91
- auto rejected = std::make_shared<bool>(false);
92
-
93
- for (size_t i = 0; i < len; ++i) {
94
- jspp::AnyValue item = arr->get_property(static_cast<uint32_t>(i));
95
-
96
- auto handleResult = [masterState, results, count, i, rejected](jspp::AnyValue res) {
97
- if (*rejected) return;
98
- (*results)[i] = res;
99
- (*count)--;
100
- if (*count == 0) {
101
- jspp::JsPromise p; p.state = masterState;
102
- p.resolve(jspp::AnyValue::make_array(std::move(*results)));
103
- }
104
- };
105
-
106
- auto handleReject = [masterState, rejected](jspp::AnyValue reason) {
107
- if (*rejected) return;
108
- *rejected = true;
109
- jspp::JsPromise p; p.state = masterState;
110
- masterState->status =jspp::PromiseStatus::Rejected; // ensure master state updated
111
- p.reject(reason);
112
- };
113
-
114
- if (item.is_promise()) {
115
- item.as_promise()->then(handleResult, handleReject);
116
- } else {
117
- handleResult(item);
118
- }
119
- }
120
-
121
- return jspp::AnyValue::make_promise(masterPromise); }, "all"));
122
- }
123
- } promiseInit;
1
+ #pragma once
2
+
3
+ #include "types.hpp"
4
+ #include "values/promise.hpp"
5
+ #include "any_value.hpp"
6
+ #include "exception.hpp"
7
+
8
+ inline auto Promise = jspp::AnyValue::make_function([](jspp::AnyValue thisVal, std::span<const jspp::AnyValue> args) -> jspp::AnyValue
9
+ {
10
+ if (args.empty() || !args[0].is_function())
11
+ {
12
+ throw jspp::Exception::make_exception("Promise resolver undefined is not a function", "TypeError");
13
+ }
14
+ auto executor = args[0].as_function();
15
+
16
+ jspp::JsPromise promise;
17
+ auto state = promise.state; // Share state
18
+
19
+ // resolve function
20
+ auto resolveFn = jspp::AnyValue::make_function([state](jspp::AnyValue, std::span<const jspp::AnyValue> args) -> jspp::AnyValue
21
+ {
22
+ jspp::JsPromise p; p.state = state;
23
+ p.resolve(args.empty() ? jspp::Constants::UNDEFINED : args[0]);
24
+ return jspp::Constants::UNDEFINED; }, "resolve");
25
+
26
+ // reject function
27
+ auto rejectFn = jspp::AnyValue::make_function([state](jspp::AnyValue, std::span<const jspp::AnyValue> args) -> jspp::AnyValue
28
+ {
29
+ jspp::JsPromise p; p.state = state;
30
+ p.reject(args.empty() ? jspp::Constants::UNDEFINED : args[0]);
31
+ return jspp::Constants::UNDEFINED; }, "reject");
32
+
33
+ try
34
+ {
35
+ const jspp::AnyValue executorArgs[] = {resolveFn, rejectFn};
36
+ executor->call(jspp::Constants::UNDEFINED, std::span<const jspp::AnyValue>(executorArgs, 2));
37
+ }
38
+ catch (const jspp::Exception &e)
39
+ {
40
+ promise.reject(e.data);
41
+ }
42
+ catch (...)
43
+ {
44
+ promise.reject(jspp::AnyValue::make_string("Unknown error during Promise execution"));
45
+ }
46
+
47
+ return jspp::AnyValue::make_promise(promise); },
48
+ "Promise");
49
+
50
+ struct PromiseInit
51
+ {
52
+ PromiseInit()
53
+ {
54
+ // Promise.resolve(value)
55
+ Promise.define_data_property("resolve", jspp::AnyValue::make_function([](jspp::AnyValue, std::span<const jspp::AnyValue> args) -> jspp::AnyValue
56
+ {
57
+ jspp::JsPromise p;
58
+ p.resolve(args.empty() ? jspp::Constants::UNDEFINED : args[0]);
59
+ return jspp::AnyValue::make_promise(p); }, "resolve"));
60
+
61
+ // Promise.reject(reason)
62
+ Promise.define_data_property("reject", jspp::AnyValue::make_function([](jspp::AnyValue, std::span<const jspp::AnyValue> args) -> jspp::AnyValue
63
+ {
64
+ jspp::JsPromise p;
65
+ p.reject(args.empty() ? jspp::Constants::UNDEFINED : args[0]);
66
+ return jspp::AnyValue::make_promise(p); }, "reject"));
67
+
68
+ // Promise.all(iterable)
69
+ Promise.define_data_property("all", jspp::AnyValue::make_function([](jspp::AnyValue, std::span<const jspp::AnyValue> args) -> jspp::AnyValue
70
+ {
71
+ // Handle non-array iterable or empty args
72
+ if (args.empty() || !args[0].is_array()) {
73
+ jspp::JsPromise p; p.reject(jspp::AnyValue::make_string("Promise.all argument must be an array"));
74
+ return jspp::AnyValue::make_promise(p);
75
+ }
76
+
77
+ auto arr = args[0].as_array();
78
+ size_t len = static_cast<size_t>(arr->length);
79
+ if (len == 0) {
80
+ jspp::JsPromise p; p.resolve(jspp::AnyValue::make_array(std::vector<jspp::AnyValue>()));
81
+ return jspp::AnyValue::make_promise(p);
82
+ }
83
+
84
+ jspp::JsPromise masterPromise;
85
+ auto masterState = masterPromise.state;
86
+
87
+ auto results = std::make_shared<std::vector<jspp::AnyValue>>(len, jspp::Constants::UNDEFINED);
88
+ auto count = std::make_shared<size_t>(len);
89
+
90
+ // Check if already rejected to avoid further processing
91
+ auto rejected = std::make_shared<bool>(false);
92
+
93
+ for (size_t i = 0; i < len; ++i) {
94
+ jspp::AnyValue item = arr->get_property(static_cast<uint32_t>(i));
95
+
96
+ auto handleResult = [masterState, results, count, i, rejected](jspp::AnyValue res) {
97
+ if (*rejected) return;
98
+ (*results)[i] = res;
99
+ (*count)--;
100
+ if (*count == 0) {
101
+ jspp::JsPromise p; p.state = masterState;
102
+ p.resolve(jspp::AnyValue::make_array(std::move(*results)));
103
+ }
104
+ };
105
+
106
+ auto handleReject = [masterState, rejected](jspp::AnyValue reason) {
107
+ if (*rejected) return;
108
+ *rejected = true;
109
+ jspp::JsPromise p; p.state = masterState;
110
+ masterState->status =jspp::PromiseStatus::Rejected; // ensure master state updated
111
+ p.reject(reason);
112
+ };
113
+
114
+ if (item.is_promise()) {
115
+ item.as_promise()->then(handleResult, handleReject);
116
+ } else {
117
+ handleResult(item);
118
+ }
119
+ }
120
+
121
+ return jspp::AnyValue::make_promise(masterPromise); }, "all"));
122
+ }
123
+ } promiseInit;
@@ -1,52 +1,52 @@
1
- #pragma once
2
-
3
- #include "types.hpp"
4
- #include "utils/well_known_symbols.hpp"
5
- #include "values/object.hpp"
6
- #include "any_value.hpp"
7
-
8
- // Define Symbol as a function
9
- inline auto Symbol = jspp::AnyValue::make_function([](jspp::AnyValue thisVal, std::span<const jspp::AnyValue> args) -> jspp::AnyValue
10
- {
11
- std::string description = "";
12
- if (!args.empty() && !args[0].is_undefined()) {
13
- description = args[0].to_std_string();
14
- }
15
- return jspp::AnyValue::make_symbol(description); }, "Symbol", false);
16
-
17
- // Initialize Symbol properties
18
- struct SymbolInit
19
- {
20
- SymbolInit()
21
- {
22
- // Static methods
23
- Symbol.define_data_property("for", jspp::AnyValue::make_function([](jspp::AnyValue, std::span<const jspp::AnyValue> args) -> jspp::AnyValue
24
- {
25
- std::string key = "";
26
- if (!args.empty()) key = args[0].to_std_string();
27
- return jspp::AnyValue::from_symbol(jspp::JsSymbol::for_global(key)); }, "for"));
28
-
29
- Symbol.define_data_property("keyFor", jspp::AnyValue::make_function([](jspp::AnyValue, std::span<const jspp::AnyValue> args) -> jspp::AnyValue
30
- {
31
- if (args.empty() || !args[0].is_symbol()) throw jspp::Exception::make_exception("Symbol.keyFor requires a symbol", "TypeError");
32
- auto sym = args[0].as_symbol();
33
- auto key = jspp::JsSymbol::key_for(sym);
34
- if (key.has_value()) return jspp::AnyValue::make_string(key.value());
35
- return jspp::Constants::UNDEFINED; }, "keyFor"));
36
-
37
- // Well-known symbols
38
- Symbol.define_data_property("iterator", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::iterator), false, false, false);
39
- Symbol.define_data_property("asyncIterator", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::asyncIterator), false, false, false);
40
- Symbol.define_data_property("hasInstance", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::hasInstance), false, false, false);
41
- Symbol.define_data_property("isConcatSpreadable", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::isConcatSpreadable), false, false, false);
42
- Symbol.define_data_property("match", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::match), false, false, false);
43
- Symbol.define_data_property("matchAll", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::matchAll), false, false, false);
44
- Symbol.define_data_property("replace", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::replace), false, false, false);
45
- Symbol.define_data_property("search", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::search), false, false, false);
46
- Symbol.define_data_property("species", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::species), false, false, false);
47
- Symbol.define_data_property("split", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::split), false, false, false);
48
- Symbol.define_data_property("toPrimitive", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::toPrimitive), false, false, false);
49
- Symbol.define_data_property("toStringTag", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::toStringTag), false, false, false);
50
- Symbol.define_data_property("unscopables", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::unscopables), false, false, false);
51
- }
52
- } symbolInit;
1
+ #pragma once
2
+
3
+ #include "types.hpp"
4
+ #include "utils/well_known_symbols.hpp"
5
+ #include "values/object.hpp"
6
+ #include "any_value.hpp"
7
+
8
+ // Define Symbol as a function
9
+ inline auto Symbol = jspp::AnyValue::make_function([](jspp::AnyValue thisVal, std::span<const jspp::AnyValue> args) -> jspp::AnyValue
10
+ {
11
+ std::string description = "";
12
+ if (!args.empty() && !args[0].is_undefined()) {
13
+ description = args[0].to_std_string();
14
+ }
15
+ return jspp::AnyValue::make_symbol(description); }, "Symbol", false);
16
+
17
+ // Initialize Symbol properties
18
+ struct SymbolInit
19
+ {
20
+ SymbolInit()
21
+ {
22
+ // Static methods
23
+ Symbol.define_data_property("for", jspp::AnyValue::make_function([](jspp::AnyValue, std::span<const jspp::AnyValue> args) -> jspp::AnyValue
24
+ {
25
+ std::string key = "";
26
+ if (!args.empty()) key = args[0].to_std_string();
27
+ return jspp::AnyValue::from_symbol(jspp::JsSymbol::for_global(key)); }, "for"));
28
+
29
+ Symbol.define_data_property("keyFor", jspp::AnyValue::make_function([](jspp::AnyValue, std::span<const jspp::AnyValue> args) -> jspp::AnyValue
30
+ {
31
+ if (args.empty() || !args[0].is_symbol()) throw jspp::Exception::make_exception("Symbol.keyFor requires a symbol", "TypeError");
32
+ auto sym = args[0].as_symbol();
33
+ auto key = jspp::JsSymbol::key_for(sym);
34
+ if (key.has_value()) return jspp::AnyValue::make_string(key.value());
35
+ return jspp::Constants::UNDEFINED; }, "keyFor"));
36
+
37
+ // Well-known symbols
38
+ Symbol.define_data_property("iterator", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::iterator), false, false, false);
39
+ Symbol.define_data_property("asyncIterator", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::asyncIterator), false, false, false);
40
+ Symbol.define_data_property("hasInstance", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::hasInstance), false, false, false);
41
+ Symbol.define_data_property("isConcatSpreadable", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::isConcatSpreadable), false, false, false);
42
+ Symbol.define_data_property("match", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::match), false, false, false);
43
+ Symbol.define_data_property("matchAll", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::matchAll), false, false, false);
44
+ Symbol.define_data_property("replace", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::replace), false, false, false);
45
+ Symbol.define_data_property("search", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::search), false, false, false);
46
+ Symbol.define_data_property("species", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::species), false, false, false);
47
+ Symbol.define_data_property("split", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::split), false, false, false);
48
+ Symbol.define_data_property("toPrimitive", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::toPrimitive), false, false, false);
49
+ Symbol.define_data_property("toStringTag", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::toStringTag), false, false, false);
50
+ Symbol.define_data_property("unscopables", jspp::AnyValue::from_symbol(jspp::WellKnownSymbols::unscopables), false, false, false);
51
+ }
52
+ } symbolInit;
@@ -1,92 +1,92 @@
1
- #pragma once
2
-
3
- #include "types.hpp"
4
- #include "any_value.hpp"
5
- #include "scheduler.hpp"
6
- #include "values/function.hpp"
7
- #include "exception.hpp"
8
-
9
- // setTimeout(callback, delay, ...args)
10
- inline auto setTimeout = jspp::AnyValue::make_function([](jspp::AnyValue thisVal, std::span<const jspp::AnyValue> args) -> jspp::AnyValue {
11
- if (args.empty() || !args[0].is_function()) {
12
- throw jspp::Exception::make_exception("Callback must be a function", "TypeError");
13
- }
14
-
15
- auto callback = args[0];
16
- double delay = 0;
17
- if (args.size() > 1 && args[1].is_number()) {
18
- delay = args[1].as_double();
19
- }
20
-
21
- // Capture arguments
22
- std::vector<jspp::AnyValue> callArgs;
23
- for (size_t i = 2; i < args.size(); ++i) {
24
- callArgs.push_back(args[i]);
25
- }
26
-
27
- auto task = [callback, callArgs]() {
28
- try {
29
- callback.call(jspp::Constants::UNDEFINED, std::span<const jspp::AnyValue>(callArgs));
30
- } catch (const jspp::Exception& e) {
31
- std::cerr << "Uncaught exception in setTimeout: " << e.what() << "\n";
32
- } catch (const std::exception& e) {
33
- std::cerr << "Uncaught exception in setTimeout: " << e.what() << "\n";
34
- } catch (...) {
35
- std::cerr << "Uncaught unknown exception in setTimeout\n";
36
- }
37
- };
38
-
39
- size_t id = jspp::Scheduler::instance().set_timeout(task, static_cast<size_t>(delay));
40
- return jspp::AnyValue::make_number(static_cast<double>(id));
41
- }, "setTimeout");
42
-
43
- // clearTimeout(id)
44
- inline auto clearTimeout = jspp::AnyValue::make_function([](jspp::AnyValue thisVal, std::span<const jspp::AnyValue> args) -> jspp::AnyValue {
45
- if (!args.empty() && args[0].is_number()) {
46
- size_t id = static_cast<size_t>(args[0].as_double());
47
- jspp::Scheduler::instance().clear_timer(id);
48
- }
49
- return jspp::Constants::UNDEFINED;
50
- }, "clearTimeout");
51
-
52
- // setInterval(callback, delay, ...args)
53
- inline auto setInterval = jspp::AnyValue::make_function([](jspp::AnyValue thisVal, std::span<const jspp::AnyValue> args) -> jspp::AnyValue {
54
- if (args.empty() || !args[0].is_function()) {
55
- throw jspp::Exception::make_exception("Callback must be a function", "TypeError");
56
- }
57
-
58
- auto callback = args[0];
59
- double delay = 0;
60
- if (args.size() > 1 && args[1].is_number()) {
61
- delay = args[1].as_double();
62
- }
63
-
64
- std::vector<jspp::AnyValue> callArgs;
65
- for (size_t i = 2; i < args.size(); ++i) {
66
- callArgs.push_back(args[i]);
67
- }
68
-
69
- auto task = [callback, callArgs]() {
70
- try {
71
- callback.call(jspp::Constants::UNDEFINED, std::span<const jspp::AnyValue>(callArgs));
72
- } catch (const jspp::Exception& e) {
73
- std::cerr << "Uncaught exception in setInterval: " << e.what() << "\n";
74
- } catch (const std::exception& e) {
75
- std::cerr << "Uncaught exception in setInterval: " << e.what() << "\n";
76
- } catch (...) {
77
- std::cerr << "Uncaught unknown exception in setInterval\n";
78
- }
79
- };
80
-
81
- size_t id = jspp::Scheduler::instance().set_interval(task, static_cast<size_t>(delay));
82
- return jspp::AnyValue::make_number(static_cast<double>(id));
83
- }, "setInterval");
84
-
85
- // clearInterval(id)
86
- inline auto clearInterval = jspp::AnyValue::make_function([](jspp::AnyValue thisVal, std::span<const jspp::AnyValue> args) -> jspp::AnyValue {
87
- if (!args.empty() && args[0].is_number()) {
88
- size_t id = static_cast<size_t>(args[0].as_double());
89
- jspp::Scheduler::instance().clear_timer(id);
90
- }
91
- return jspp::Constants::UNDEFINED;
1
+ #pragma once
2
+
3
+ #include "types.hpp"
4
+ #include "any_value.hpp"
5
+ #include "scheduler.hpp"
6
+ #include "values/function.hpp"
7
+ #include "exception.hpp"
8
+
9
+ // setTimeout(callback, delay, ...args)
10
+ inline auto setTimeout = jspp::AnyValue::make_function([](jspp::AnyValue thisVal, std::span<const jspp::AnyValue> args) -> jspp::AnyValue {
11
+ if (args.empty() || !args[0].is_function()) {
12
+ throw jspp::Exception::make_exception("Callback must be a function", "TypeError");
13
+ }
14
+
15
+ auto callback = args[0];
16
+ double delay = 0;
17
+ if (args.size() > 1 && args[1].is_number()) {
18
+ delay = args[1].as_double();
19
+ }
20
+
21
+ // Capture arguments
22
+ std::vector<jspp::AnyValue> callArgs;
23
+ for (size_t i = 2; i < args.size(); ++i) {
24
+ callArgs.push_back(args[i]);
25
+ }
26
+
27
+ auto task = [callback, callArgs]() {
28
+ try {
29
+ callback.call(jspp::Constants::UNDEFINED, std::span<const jspp::AnyValue>(callArgs));
30
+ } catch (const jspp::Exception& e) {
31
+ std::cerr << "Uncaught exception in setTimeout: " << e.what() << "\n";
32
+ } catch (const std::exception& e) {
33
+ std::cerr << "Uncaught exception in setTimeout: " << e.what() << "\n";
34
+ } catch (...) {
35
+ std::cerr << "Uncaught unknown exception in setTimeout\n";
36
+ }
37
+ };
38
+
39
+ size_t id = jspp::Scheduler::instance().set_timeout(task, static_cast<size_t>(delay));
40
+ return jspp::AnyValue::make_number(static_cast<double>(id));
41
+ }, "setTimeout");
42
+
43
+ // clearTimeout(id)
44
+ inline auto clearTimeout = jspp::AnyValue::make_function([](jspp::AnyValue thisVal, std::span<const jspp::AnyValue> args) -> jspp::AnyValue {
45
+ if (!args.empty() && args[0].is_number()) {
46
+ size_t id = static_cast<size_t>(args[0].as_double());
47
+ jspp::Scheduler::instance().clear_timer(id);
48
+ }
49
+ return jspp::Constants::UNDEFINED;
50
+ }, "clearTimeout");
51
+
52
+ // setInterval(callback, delay, ...args)
53
+ inline auto setInterval = jspp::AnyValue::make_function([](jspp::AnyValue thisVal, std::span<const jspp::AnyValue> args) -> jspp::AnyValue {
54
+ if (args.empty() || !args[0].is_function()) {
55
+ throw jspp::Exception::make_exception("Callback must be a function", "TypeError");
56
+ }
57
+
58
+ auto callback = args[0];
59
+ double delay = 0;
60
+ if (args.size() > 1 && args[1].is_number()) {
61
+ delay = args[1].as_double();
62
+ }
63
+
64
+ std::vector<jspp::AnyValue> callArgs;
65
+ for (size_t i = 2; i < args.size(); ++i) {
66
+ callArgs.push_back(args[i]);
67
+ }
68
+
69
+ auto task = [callback, callArgs]() {
70
+ try {
71
+ callback.call(jspp::Constants::UNDEFINED, std::span<const jspp::AnyValue>(callArgs));
72
+ } catch (const jspp::Exception& e) {
73
+ std::cerr << "Uncaught exception in setInterval: " << e.what() << "\n";
74
+ } catch (const std::exception& e) {
75
+ std::cerr << "Uncaught exception in setInterval: " << e.what() << "\n";
76
+ } catch (...) {
77
+ std::cerr << "Uncaught unknown exception in setInterval\n";
78
+ }
79
+ };
80
+
81
+ size_t id = jspp::Scheduler::instance().set_interval(task, static_cast<size_t>(delay));
82
+ return jspp::AnyValue::make_number(static_cast<double>(id));
83
+ }, "setInterval");
84
+
85
+ // clearInterval(id)
86
+ inline auto clearInterval = jspp::AnyValue::make_function([](jspp::AnyValue thisVal, std::span<const jspp::AnyValue> args) -> jspp::AnyValue {
87
+ if (!args.empty() && args[0].is_number()) {
88
+ size_t id = static_cast<size_t>(args[0].as_double());
89
+ jspp::Scheduler::instance().clear_timer(id);
90
+ }
91
+ return jspp::Constants::UNDEFINED;
92
92
  }, "clearInterval");