@devaloop/devalang 0.0.1-beta.1 → 0.0.1-beta.2

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 (220) hide show
  1. package/.devalang +9 -10
  2. package/Cargo.toml +5 -4
  3. package/README.md +7 -5
  4. package/docs/CHANGELOG.md +42 -0
  5. package/docs/ROADMAP.md +5 -1
  6. package/docs/TODO.md +3 -14
  7. package/examples/bus.deva +10 -0
  8. package/examples/effect.deva +2 -0
  9. package/examples/filter.deva +11 -0
  10. package/examples/lfo.deva +9 -0
  11. package/examples/synth.deva +11 -1
  12. package/examples/synth_types.deva +17 -0
  13. package/out-tsc/core/functions/index.d.ts +5 -0
  14. package/out-tsc/core/functions/index.js +11 -0
  15. package/out-tsc/pkg/devalang_core.d.ts +2 -0
  16. package/out-tsc/pkg/devalang_core.js +17 -2
  17. package/out-tsc/pkg/devalang_core_bg.wasm.d.ts +8 -7
  18. package/package.json +1 -1
  19. package/project-version.json +3 -3
  20. package/rust/cli/bank/api.rs +122 -122
  21. package/rust/cli/bank/commands.rs +33 -2
  22. package/rust/cli/bank/mod.rs +29 -29
  23. package/rust/cli/build/commands.rs +53 -3
  24. package/rust/cli/build/mod.rs +2 -2
  25. package/rust/cli/build/process.rs +26 -7
  26. package/rust/cli/check/mod.rs +2 -2
  27. package/rust/cli/discover/commands.rs +253 -253
  28. package/rust/cli/discover/config.rs +111 -111
  29. package/rust/cli/discover/fs.rs +19 -19
  30. package/rust/cli/discover/install.rs +103 -103
  31. package/rust/cli/discover/metadata.rs +48 -48
  32. package/rust/cli/discover/mod.rs +5 -5
  33. package/rust/cli/install/addon.rs +118 -118
  34. package/rust/cli/install/bank.rs +22 -3
  35. package/rust/cli/install/commands.rs +35 -35
  36. package/rust/cli/install/mod.rs +4 -4
  37. package/rust/cli/install/plugin.rs +80 -61
  38. package/rust/cli/login/commands.rs +124 -124
  39. package/rust/cli/mod.rs +12 -12
  40. package/rust/cli/parser.rs +46 -1
  41. package/rust/cli/play/commands.rs +71 -20
  42. package/rust/cli/play/mod.rs +5 -5
  43. package/rust/cli/play/process.rs +14 -5
  44. package/rust/cli/play/realtime.rs +91 -91
  45. package/rust/cli/telemetry/commands.rs +22 -22
  46. package/rust/cli/telemetry/event_creator.rs +80 -80
  47. package/rust/cli/telemetry/mod.rs +3 -3
  48. package/rust/cli/telemetry/send.rs +51 -51
  49. package/rust/cli/template/commands.rs +69 -69
  50. package/rust/config/driver.rs +112 -103
  51. package/rust/config/mod.rs +3 -3
  52. package/rust/config/ops.rs +26 -26
  53. package/rust/config/settings.rs +101 -101
  54. package/rust/core/audio/engine/driver.rs +220 -0
  55. package/rust/core/audio/engine/export.rs +169 -0
  56. package/rust/core/audio/engine/helpers.rs +178 -170
  57. package/rust/core/audio/engine/mod.rs +51 -2
  58. package/rust/core/audio/engine/notes/dsp.rs +85 -0
  59. package/rust/core/audio/engine/notes/mod.rs +44 -0
  60. package/rust/core/audio/engine/notes/params.rs +294 -0
  61. package/rust/core/audio/engine/sample/insert.rs +199 -0
  62. package/rust/core/audio/engine/sample/mod.rs +40 -0
  63. package/rust/core/audio/engine/sample/padding.rs +170 -0
  64. package/rust/core/audio/evaluator/condition.rs +61 -0
  65. package/rust/core/audio/evaluator/mod.rs +9 -0
  66. package/rust/core/audio/{evaluator.rs → evaluator/numeric.rs} +1 -159
  67. package/rust/core/audio/evaluator/rhs.rs +16 -0
  68. package/rust/core/audio/evaluator/string_expr.rs +94 -0
  69. package/rust/core/audio/interpreter/driver.rs +55 -23
  70. package/rust/core/audio/interpreter/mod.rs +1 -13
  71. package/rust/core/audio/interpreter/statements/arrow_call/interprete.rs +175 -0
  72. package/rust/core/audio/interpreter/statements/arrow_call/methods/chord.rs +384 -0
  73. package/rust/core/audio/interpreter/statements/arrow_call/methods/mod.rs +2 -0
  74. package/rust/core/audio/interpreter/statements/arrow_call/methods/note.rs +316 -0
  75. package/rust/core/audio/interpreter/statements/arrow_call/mod.rs +3 -0
  76. package/rust/core/audio/interpreter/statements/arrow_call/types/arp.rs +192 -0
  77. package/rust/core/audio/interpreter/statements/arrow_call/types/mod.rs +24 -0
  78. package/rust/core/audio/interpreter/statements/arrow_call/types/pad.rs +116 -0
  79. package/rust/core/audio/interpreter/statements/arrow_call/types/pluck.rs +97 -0
  80. package/rust/core/audio/interpreter/statements/arrow_call/types/sub.rs +100 -0
  81. package/rust/core/audio/interpreter/{automate.rs → statements/automate.rs} +16 -18
  82. package/rust/core/audio/interpreter/{call.rs → statements/call.rs} +5 -4
  83. package/rust/core/audio/interpreter/{condition.rs → statements/condition.rs} +2 -1
  84. package/rust/core/audio/interpreter/{function.rs → statements/function.rs} +2 -4
  85. package/rust/core/audio/interpreter/{let_.rs → statements/let_.rs} +2 -4
  86. package/rust/core/audio/interpreter/{load.rs → statements/load.rs} +2 -4
  87. package/rust/core/audio/interpreter/{loop_.rs → statements/loop_.rs} +2 -1
  88. package/rust/core/audio/interpreter/statements/mod.rs +12 -0
  89. package/rust/core/audio/interpreter/{sleep.rs → statements/sleep.rs} +28 -28
  90. package/rust/core/audio/interpreter/{spawn.rs → statements/spawn.rs} +3 -2
  91. package/rust/core/audio/interpreter/{tempo.rs → statements/tempo.rs} +40 -40
  92. package/rust/core/audio/interpreter/{trigger.rs → statements/trigger.rs} +1 -1
  93. package/rust/core/audio/loader/trigger.rs +2 -1
  94. package/rust/core/audio/mod.rs +6 -7
  95. package/rust/core/audio/player.rs +70 -70
  96. package/rust/core/audio/special/easing.rs +189 -189
  97. package/rust/core/audio/special/env.rs +45 -45
  98. package/rust/core/audio/special/math.rs +134 -134
  99. package/rust/core/audio/special/mod.rs +9 -9
  100. package/rust/core/audio/special/modulator.rs +143 -143
  101. package/rust/core/builder/mod.rs +45 -2
  102. package/rust/core/debugger/lexer.rs +27 -27
  103. package/rust/core/debugger/{module.rs → logs.rs} +3 -6
  104. package/rust/core/debugger/mod.rs +30 -30
  105. package/rust/core/debugger/preprocessor.rs +27 -27
  106. package/rust/core/debugger/store.rs +2 -4
  107. package/rust/core/error/mod.rs +269 -269
  108. package/rust/core/lexer/driver.rs +59 -61
  109. package/rust/core/lexer/handler/arrow.rs +82 -82
  110. package/rust/core/lexer/handler/at.rs +21 -21
  111. package/rust/core/lexer/handler/brace.rs +41 -41
  112. package/rust/core/lexer/handler/colon.rs +21 -21
  113. package/rust/core/lexer/handler/comment.rs +30 -30
  114. package/rust/core/lexer/handler/dot.rs +21 -21
  115. package/rust/core/lexer/handler/driver.rs +337 -337
  116. package/rust/core/lexer/handler/identifier.rs +47 -47
  117. package/rust/core/lexer/handler/indent.rs +66 -66
  118. package/rust/core/lexer/handler/mod.rs +15 -15
  119. package/rust/core/lexer/handler/newline.rs +23 -23
  120. package/rust/core/lexer/handler/number.rs +31 -31
  121. package/rust/core/lexer/handler/operator.rs +46 -46
  122. package/rust/core/lexer/handler/parenthesis.rs +41 -41
  123. package/rust/core/lexer/handler/slash.rs +21 -21
  124. package/rust/core/lexer/handler/string.rs +63 -63
  125. package/rust/core/lexer/mod.rs +3 -3
  126. package/rust/core/mod.rs +0 -1
  127. package/rust/core/parser/driver/block.rs +111 -0
  128. package/rust/core/parser/driver/cursor.rs +82 -0
  129. package/rust/core/parser/driver/driver_impl.rs +139 -0
  130. package/rust/core/parser/driver/mod.rs +6 -0
  131. package/rust/core/parser/driver/parse_array.rs +120 -0
  132. package/rust/core/parser/driver/parse_map.rs +223 -0
  133. package/rust/core/parser/driver/parser.rs +160 -0
  134. package/rust/core/parser/handler/arrow_call.rs +28 -4
  135. package/rust/core/parser/handler/at.rs +279 -279
  136. package/rust/core/parser/handler/bank.rs +104 -104
  137. package/rust/core/parser/handler/condition.rs +83 -83
  138. package/rust/core/parser/handler/dot.rs +148 -148
  139. package/rust/core/parser/handler/identifier/automate.rs +254 -254
  140. package/rust/core/parser/handler/identifier/call.rs +91 -91
  141. package/rust/core/parser/handler/identifier/emit.rs +70 -70
  142. package/rust/core/parser/handler/identifier/function.rs +113 -113
  143. package/rust/core/parser/handler/identifier/group.rs +89 -89
  144. package/rust/core/parser/handler/identifier/let_.rs +173 -173
  145. package/rust/core/parser/handler/identifier/mod.rs +55 -55
  146. package/rust/core/parser/handler/identifier/on.rs +107 -107
  147. package/rust/core/parser/handler/identifier/print.rs +49 -49
  148. package/rust/core/parser/handler/identifier/sleep.rs +96 -43
  149. package/rust/core/parser/handler/identifier/spawn.rs +91 -91
  150. package/rust/core/parser/handler/identifier/synth.rs +135 -135
  151. package/rust/core/parser/handler/loop_.rs +194 -194
  152. package/rust/core/parser/handler/mod.rs +9 -9
  153. package/rust/core/parser/handler/pattern.rs +1 -1
  154. package/rust/core/parser/handler/tempo.rs +105 -57
  155. package/rust/core/parser/statement.rs +10 -11
  156. package/rust/core/plugin/loader.rs +1 -1
  157. package/rust/core/plugin/mod.rs +2 -2
  158. package/rust/core/plugin/runner/mod.rs +11 -0
  159. package/rust/core/plugin/{runner.rs → runner/non_wasm.rs} +297 -347
  160. package/rust/core/plugin/runner/wasm32.rs +43 -0
  161. package/rust/core/preprocessor/loader/inject.rs +278 -0
  162. package/rust/core/preprocessor/loader/loader_helpers.rs +110 -0
  163. package/rust/core/preprocessor/loader/mod.rs +235 -0
  164. package/rust/core/preprocessor/module.rs +2 -7
  165. package/rust/core/preprocessor/{processor.rs → processor/handlers.rs} +6 -13
  166. package/rust/core/preprocessor/processor/mod.rs +1 -0
  167. package/rust/core/preprocessor/resolver/bank.rs +49 -49
  168. package/rust/core/preprocessor/resolver/call.rs +124 -124
  169. package/rust/core/preprocessor/resolver/condition.rs +95 -95
  170. package/rust/core/preprocessor/resolver/driver.rs +324 -324
  171. package/rust/core/preprocessor/resolver/function.rs +2 -2
  172. package/rust/core/preprocessor/resolver/group.rs +46 -18
  173. package/rust/core/preprocessor/resolver/let_.rs +32 -32
  174. package/rust/core/preprocessor/resolver/loop_.rs +318 -318
  175. package/rust/core/preprocessor/resolver/mod.rs +16 -16
  176. package/rust/core/preprocessor/resolver/pattern.rs +83 -83
  177. package/rust/core/preprocessor/resolver/spawn.rs +99 -99
  178. package/rust/core/preprocessor/resolver/synth.rs +54 -54
  179. package/rust/core/preprocessor/resolver/tempo.rs +48 -48
  180. package/rust/core/preprocessor/resolver/trigger.rs +116 -116
  181. package/rust/core/preprocessor/resolver/value.rs +176 -176
  182. package/rust/core/store/global.rs +2 -6
  183. package/rust/core/store/mod.rs +1 -5
  184. package/rust/lib.rs +18 -3
  185. package/rust/main.rs +27 -3
  186. package/rust/types/Cargo.toml +1 -1
  187. package/rust/types/src/addons.rs +55 -55
  188. package/rust/types/src/config.rs +84 -74
  189. package/rust/types/src/lib.rs +15 -12
  190. package/rust/types/src/plugin.rs +20 -0
  191. package/rust/types/src/store.rs +139 -0
  192. package/rust/types/src/telemetry.rs +85 -85
  193. package/rust/utils/Cargo.toml +2 -2
  194. package/rust/utils/src/file.rs +94 -94
  195. package/rust/utils/src/first_usage.rs +97 -97
  196. package/rust/utils/src/lib.rs +9 -9
  197. package/rust/utils/src/logger.rs +200 -200
  198. package/rust/utils/src/path.rs +129 -88
  199. package/rust/utils/src/signature.rs +41 -41
  200. package/rust/utils/src/spinner.rs +20 -20
  201. package/rust/utils/src/version.rs +27 -27
  202. package/rust/utils/src/watcher.rs +46 -46
  203. package/rust/web/api.rs +5 -5
  204. package/rust/web/cdn.rs +34 -34
  205. package/rust/web/mod.rs +3 -3
  206. package/tests/integration.rs +21 -21
  207. package/typescript/core/functions/index.ts +11 -0
  208. package/typescript/pkg/devalang_core.ts +20 -4
  209. package/rust/core/audio/engine/sample.rs +0 -366
  210. package/rust/core/audio/engine/synth.rs +0 -325
  211. package/rust/core/audio/interpreter/arrow_call.rs +0 -311
  212. package/rust/core/audio/renderer.rs +0 -54
  213. package/rust/core/parser/driver.rs +0 -584
  214. package/rust/core/preprocessor/loader.rs +0 -637
  215. package/rust/core/store/export.rs +0 -28
  216. package/rust/core/store/function.rs +0 -40
  217. package/rust/core/store/import.rs +0 -28
  218. package/rust/core/store/variable.rs +0 -51
  219. package/rust/core/utils/mod.rs +0 -1
  220. package/rust/core/utils/path.rs +0 -37
@@ -1,41 +1,41 @@
1
- #[cfg(feature = "cli")]
2
- pub fn get_signature(version: &str) -> String {
3
- let signature = format!(
4
- r#"
5
- /|_/|
6
- / ^ ^(_o 🦊 Devalang
7
- / __.'
8
- / \ A programming language for music and sound.
9
- / _ \_ Part of the Devaloop project.
10
- (_) (_) '._
11
- '.__ '. .-''-'. https://devalang.com
12
- ( '. ('.____.''
13
- _) )'_, ) v{}
14
- (__/ (__/
15
- "#,
16
- version
17
- );
18
-
19
- signature
20
- }
21
-
22
- #[cfg(not(feature = "cli"))]
23
- pub fn get_signature(version: &str) -> String {
24
- let signature = format!(
25
- r#"
26
- /|_/|
27
- / ^ ^(_o 🦊 Devalang
28
- / __.'
29
- / \ A programming language for music and sound.
30
- / _ \_ Part of the Devaloop project.
31
- (_) (_) '._
32
- '.__ '. .-''-'. https://devalang.com
33
- ( '. ('.____.''
34
- _) )'_, ) v{}
35
- (__/ (__/
36
- "#,
37
- version
38
- );
39
-
40
- signature
41
- }
1
+ #[cfg(feature = "cli")]
2
+ pub fn get_signature(version: &str) -> String {
3
+ let signature = format!(
4
+ r#"
5
+ /|_/|
6
+ / ^ ^(_o 🦊 Devalang
7
+ / __.'
8
+ / \ A programming language for music and sound.
9
+ / _ \_ Part of the Devaloop project.
10
+ (_) (_) '._
11
+ '.__ '. .-''-'. https://devalang.com
12
+ ( '. ('.____.''
13
+ _) )'_, ) v{}
14
+ (__/ (__/
15
+ "#,
16
+ version
17
+ );
18
+
19
+ signature
20
+ }
21
+
22
+ #[cfg(not(feature = "cli"))]
23
+ pub fn get_signature(version: &str) -> String {
24
+ let signature = format!(
25
+ r#"
26
+ /|_/|
27
+ / ^ ^(_o 🦊 Devalang
28
+ / __.'
29
+ / \ A programming language for music and sound.
30
+ / _ \_ Part of the Devaloop project.
31
+ (_) (_) '._
32
+ '.__ '. .-''-'. https://devalang.com
33
+ ( '. ('.____.''
34
+ _) )'_, ) v{}
35
+ (__/ (__/
36
+ "#,
37
+ version
38
+ );
39
+
40
+ signature
41
+ }
@@ -1,20 +1,20 @@
1
- #[cfg(feature = "cli")]
2
- use indicatif::{ProgressBar, ProgressStyle};
3
- #[cfg(feature = "cli")]
4
- use std::time::Duration;
5
-
6
- #[cfg(feature = "cli")]
7
- pub fn start_spinner(start_msg: &str) -> ProgressBar {
8
- let spinner = ProgressBar::new_spinner();
9
- spinner.set_style(
10
- ProgressStyle::with_template("{spinner:.green} {msg}")
11
- .unwrap()
12
- .tick_strings(&["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"]),
13
- );
14
- spinner.set_message(start_msg.to_string());
15
- spinner.enable_steady_tick(Duration::from_millis(80));
16
-
17
- std::thread::sleep(Duration::from_millis(750));
18
-
19
- spinner
20
- }
1
+ #[cfg(feature = "cli")]
2
+ use indicatif::{ProgressBar, ProgressStyle};
3
+ #[cfg(feature = "cli")]
4
+ use std::time::Duration;
5
+
6
+ #[cfg(feature = "cli")]
7
+ pub fn start_spinner(start_msg: &str) -> ProgressBar {
8
+ let spinner = ProgressBar::new_spinner();
9
+ spinner.set_style(
10
+ ProgressStyle::with_template("{spinner:.green} {msg}")
11
+ .unwrap()
12
+ .tick_strings(&["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"]),
13
+ );
14
+ spinner.set_message(start_msg.to_string());
15
+ spinner.enable_steady_tick(Duration::from_millis(80));
16
+
17
+ std::thread::sleep(Duration::from_millis(750));
18
+
19
+ spinner
20
+ }
@@ -1,27 +1,27 @@
1
- use crate::{path::get_package_root, signature::get_signature};
2
-
3
- pub fn get_version() -> String {
4
- if let Some(root) = get_package_root() {
5
- let project_version_json = root.join("project-version.json");
6
- if let Ok(version) = std::fs::read_to_string(project_version_json) {
7
- if let Ok(parsed) = serde_json::from_str::<serde_json::Value>(&version) {
8
- if let Some(version_val) = parsed.get("version") {
9
- if let Some(s) = version_val.as_str() {
10
- return s.to_string();
11
- }
12
- }
13
- }
14
- }
15
- }
16
-
17
- "0.0.0".to_string()
18
- }
19
-
20
- pub fn get_version_with_signature() -> String {
21
- let version = get_version();
22
- let signature = get_signature(&version);
23
-
24
- println!("{}", signature);
25
-
26
- "(c) 2025 Devaloop. All rights reserved.".to_string()
27
- }
1
+ use crate::{ path::get_package_root, signature::get_signature };
2
+
3
+ pub fn get_version() -> String {
4
+ if let Some(root) = get_package_root() {
5
+ let project_version_json = root.join("package.json");
6
+ if let Ok(version) = std::fs::read_to_string(project_version_json) {
7
+ if let Ok(parsed) = serde_json::from_str::<serde_json::Value>(&version) {
8
+ if let Some(version_val) = parsed.get("version") {
9
+ if let Some(s) = version_val.as_str() {
10
+ return s.to_string();
11
+ }
12
+ }
13
+ }
14
+ }
15
+ }
16
+
17
+ "0.0.0".to_string()
18
+ }
19
+
20
+ pub fn get_version_with_signature() -> String {
21
+ let version = get_version();
22
+ let signature = get_signature(&version);
23
+
24
+ println!("{}", signature);
25
+
26
+ "(c) 2025 Devaloop. All rights reserved.".to_string()
27
+ }
@@ -1,46 +1,46 @@
1
- use notify::{Config, RecommendedWatcher, RecursiveMode, Watcher};
2
- use std::sync::mpsc::channel;
3
-
4
- use std::time::{Duration, Instant};
5
-
6
- pub fn watch_directory<F>(entry: String, callback: F) -> notify::Result<()>
7
- where
8
- F: Fn() + Send + 'static,
9
- {
10
- let (tx, rx) = channel();
11
-
12
- let mut watcher: RecommendedWatcher = Watcher::new(tx, Config::default())?;
13
- watcher.watch(&entry.as_ref(), RecursiveMode::Recursive)?;
14
-
15
- let mut last_trigger = Instant::now();
16
-
17
- loop {
18
- match rx.recv() {
19
- Ok(_) => {
20
- let now = Instant::now();
21
- if now.duration_since(last_trigger) > Duration::from_millis(200) {
22
- callback();
23
- last_trigger = now;
24
- }
25
- }
26
- Err(e) => {
27
- // Prefer structured logging when available
28
- #[cfg(feature = "cli")]
29
- {
30
- let logger = crate::logger::Logger::new();
31
- logger.log_message(
32
- crate::logger::LogLevel::Error,
33
- &format!("Channel error: {:?}", e),
34
- );
35
- }
36
- #[cfg(not(feature = "cli"))]
37
- {
38
- eprintln!("Channel error: {:?}", e);
39
- }
40
- break;
41
- }
42
- }
43
- }
44
-
45
- Ok(())
46
- }
1
+ use notify::{Config, RecommendedWatcher, RecursiveMode, Watcher};
2
+ use std::sync::mpsc::channel;
3
+
4
+ use std::time::{Duration, Instant};
5
+
6
+ pub fn watch_directory<F>(entry: String, callback: F) -> notify::Result<()>
7
+ where
8
+ F: Fn() + Send + 'static,
9
+ {
10
+ let (tx, rx) = channel();
11
+
12
+ let mut watcher: RecommendedWatcher = Watcher::new(tx, Config::default())?;
13
+ watcher.watch(&entry.as_ref(), RecursiveMode::Recursive)?;
14
+
15
+ let mut last_trigger = Instant::now();
16
+
17
+ loop {
18
+ match rx.recv() {
19
+ Ok(_) => {
20
+ let now = Instant::now();
21
+ if now.duration_since(last_trigger) > Duration::from_millis(200) {
22
+ callback();
23
+ last_trigger = now;
24
+ }
25
+ }
26
+ Err(e) => {
27
+ // Prefer structured logging when available
28
+ #[cfg(feature = "cli")]
29
+ {
30
+ let logger = crate::logger::Logger::new();
31
+ logger.log_message(
32
+ crate::logger::LogLevel::Error,
33
+ &format!("Channel error: {:?}", e),
34
+ );
35
+ }
36
+ #[cfg(not(feature = "cli"))]
37
+ {
38
+ eprintln!("Channel error: {:?}", e);
39
+ }
40
+ break;
41
+ }
42
+ }
43
+ }
44
+
45
+ Ok(())
46
+ }
package/rust/web/api.rs CHANGED
@@ -1,5 +1,5 @@
1
- pub fn get_api_url() -> String {
2
- let api_url = "https://api.devalang.com";
3
- // let api_url = "http://127.0.0.1:8989";
4
- api_url.to_string()
5
- }
1
+ pub fn get_api_url() -> String {
2
+ let api_url = "https://api.devalang.com";
3
+ // let api_url = "http://127.0.0.1:8989";
4
+ api_url.to_string()
5
+ }
package/rust/web/cdn.rs CHANGED
@@ -1,34 +1,34 @@
1
- use std::error::Error;
2
- use std::fs::File;
3
- use std::io::{Cursor, copy};
4
- use std::path::Path;
5
-
6
- pub fn get_cdn_url() -> String {
7
- let cdn_url = "https://cdn.devalang.com";
8
- // let cdn_url = "http://127.0.0.1:8888";
9
- cdn_url.to_string()
10
- }
11
-
12
- pub async fn download_from_cdn(url: &str, destination: &Path) -> Result<(), Box<dyn Error>> {
13
- if !url.starts_with(&get_cdn_url()) {
14
- return Err(format!("Invalid CDN URL: {}", url).into());
15
- }
16
-
17
- let response = reqwest::get(url).await?;
18
-
19
- if !response.status().is_success() {
20
- return Err(format!("Failed to download file: HTTP {}", response.status()).into());
21
- }
22
-
23
- if let Some(parent) = destination.parent() {
24
- std::fs::create_dir_all(parent)?;
25
- }
26
-
27
- let bytes = response.bytes().await?;
28
- let mut content = Cursor::new(bytes);
29
- let mut file = File::create(destination)?;
30
-
31
- copy(&mut content, &mut file)?;
32
-
33
- Ok(())
34
- }
1
+ use std::error::Error;
2
+ use std::fs::File;
3
+ use std::io::{Cursor, copy};
4
+ use std::path::Path;
5
+
6
+ pub fn get_cdn_url() -> String {
7
+ let cdn_url = "https://cdn.devalang.com";
8
+ // let cdn_url = "http://127.0.0.1:8888";
9
+ cdn_url.to_string()
10
+ }
11
+
12
+ pub async fn download_from_cdn(url: &str, destination: &Path) -> Result<(), Box<dyn Error>> {
13
+ if !url.starts_with(&get_cdn_url()) {
14
+ return Err(format!("Invalid CDN URL: {}", url).into());
15
+ }
16
+
17
+ let response = reqwest::get(url).await?;
18
+
19
+ if !response.status().is_success() {
20
+ return Err(format!("Failed to download file: HTTP {}", response.status()).into());
21
+ }
22
+
23
+ if let Some(parent) = destination.parent() {
24
+ std::fs::create_dir_all(parent)?;
25
+ }
26
+
27
+ let bytes = response.bytes().await?;
28
+ let mut content = Cursor::new(bytes);
29
+ let mut file = File::create(destination)?;
30
+
31
+ copy(&mut content, &mut file)?;
32
+
33
+ Ok(())
34
+ }
package/rust/web/mod.rs CHANGED
@@ -1,3 +1,3 @@
1
- pub mod api;
2
- pub mod cdn;
3
- pub mod sso;
1
+ pub mod api;
2
+ pub mod cdn;
3
+ pub mod sso;
@@ -1,21 +1,21 @@
1
- // Aggregator test: include tests from tests/rust/* as distinct modules.
2
- // This keeps sources organized while providing a single integration test
3
- // file that Cargo will compile and run.
4
-
5
- mod rust_tests {
6
- pub mod cli_help {
7
- include!("rust/cli_help.rs");
8
- }
9
- pub mod cli_version {
10
- include!("rust/cli_version.rs");
11
- }
12
- pub mod cli_template_list {
13
- include!("rust/cli_template_list.rs");
14
- }
15
- pub mod cli_check_build {
16
- include!("rust/cli_check_build.rs");
17
- }
18
- }
19
-
20
- // Re-export tests so the test runner finds them at crate root.
21
- pub use rust_tests::*;
1
+ // Aggregator test: include tests from tests/rust/* as distinct modules.
2
+ // This keeps sources organized while providing a single integration test
3
+ // file that Cargo will compile and run.
4
+
5
+ mod rust_tests {
6
+ pub mod cli_help {
7
+ include!("rust/cli_help.rs");
8
+ }
9
+ pub mod cli_version {
10
+ include!("rust/cli_version.rs");
11
+ }
12
+ pub mod cli_template_list {
13
+ include!("rust/cli_template_list.rs");
14
+ }
15
+ pub mod cli_check_build {
16
+ include!("rust/cli_check_build.rs");
17
+ }
18
+ }
19
+
20
+ // Re-export tests so the test runner finds them at crate root.
21
+ pub use rust_tests::*;
@@ -71,6 +71,17 @@ export function register_playhead_callback(cb: (ev: { time: number; line: number
71
71
  return;
72
72
  }
73
73
 
74
+ /**
75
+ * Collects playhead events that have been recorded during playback.
76
+ * @returns Array of playhead events { time, line, column }.
77
+ */
78
+ export function collect_playhead_events() {
79
+ if (wasmPkg && typeof wasmPkg.collect_playhead_events === "function") {
80
+ return wasmPkg.collect_playhead_events();
81
+ }
82
+ return [];
83
+ }
84
+
74
85
  /**
75
86
  * Unregisters the JS callback for playhead events.
76
87
  * @returns void
@@ -10,8 +10,7 @@ try {
10
10
  // (this keeps tests and consumers robust).
11
11
  // eslint-disable-next-line @typescript-eslint/no-var-requires
12
12
  runtimePkg = require("../../pkg/devalang_core");
13
- }
14
- catch (e) {
13
+ } catch (e) {
15
14
  runtimePkg = undefined;
16
15
  }
17
16
 
@@ -39,11 +38,28 @@ export function register_playhead_callback(cb?: any) {
39
38
  return;
40
39
  }
41
40
 
41
+ export function collect_playhead_events() {
42
+ if (runtimePkg && typeof runtimePkg.collect_playhead_events === "function") {
43
+ return runtimePkg.collect_playhead_events();
44
+ }
45
+ return [];
46
+ }
47
+
42
48
  export function unregister_playhead_callback() {
43
- if (runtimePkg && typeof runtimePkg.unregister_playhead_callback === "function")
49
+ if (
50
+ runtimePkg &&
51
+ typeof runtimePkg.unregister_playhead_callback === "function"
52
+ )
44
53
  return runtimePkg.unregister_playhead_callback();
45
54
  return;
46
55
  }
47
56
 
48
- const pkg = { parse, debug_render, render_audio, register_playhead_callback, unregister_playhead_callback };
57
+ const pkg = {
58
+ parse,
59
+ debug_render,
60
+ render_audio,
61
+ register_playhead_callback,
62
+ collect_playhead_events,
63
+ unregister_playhead_callback,
64
+ };
49
65
  export default pkg;