Refactor `event_loop/threadsafe_function` file into `event_loop::js_function` module

finchie
Jan 1, 2026, 7:12 AM
QY4Z5ZXZ7G6DZFCTRPX7D6TIDZ5DHSDTLOWFDANIPUHOEKQRAIXAC

Dependencies

  • [2] 3YGYMEXV Create `event_loop` module
  • [3] TDTLSDFG Create macro for defining `ThreadsafeFunction`s
  • [4] NB2MF3MY Add `OpenWorkspaceFolder` event
  • [5] XDFSAPI7 Create a tokio runtime directly instead of `#[tokio::main]`
  • [6] MGJ23FHF Assign repository URI to source control in `OpenWorkspaceFolder` events
  • [7] OUADGWKR Create fully-initialized `SourceControl` object in `event_loop`
  • [8] 2ZAM5V35 Move event handling into modules
  • [9] SLTXBK5G Recursively discover repositories when handling `OpenWorkspaceFolder` event
  • [10] TWEUQ64D Move threadsafe function builder logic into function-specific modules

Change contents

  • replacement in editors/vscode/src/event_loop/mod.rs at line 13
    [8.83][4.1534:1559](),[3.1733][4.1534:1559]()
    mod threadsafe_function;
    [8.83]
    [2.259]
    mod js_function;
  • replacement in editors/vscode/src/event_loop/mod.rs at line 28
    [2.455][4.1621:1758]()
    async fn event_loop(
    threadsafe_functions: threadsafe_function::ThreadsafeFunctions,
    mut receiver: UnboundedReceiver<Event>,
    ) {
    [2.455]
    [2.517]
    async fn event_loop(js_functions: js_function::Functions, mut receiver: UnboundedReceiver<Event>) {
  • replacement in editors/vscode/src/event_loop/mod.rs at line 47
    [6.1532][8.84:314]()
    event::open_workspace_folder::handle(
    raw_uri,
    &mut repositories,
    &threadsafe_functions,
    )
    .await
    [6.1532]
    [4.2519]
    event::open_workspace_folder::handle(raw_uri, &mut repositories, &js_functions)
    .await
  • replacement in editors/vscode/src/event_loop/mod.rs at line 64
    [7.5487][7.5487:5586]()
    let threadsafe_functions = threadsafe_function::ThreadsafeFunctions::get(env, vscode_object)?;
    [7.5487]
    [4.2738]
    let js_functions = js_function::Functions::get(env, vscode_object)?;
  • replacement in editors/vscode/src/event_loop/mod.rs at line 76
    [5.161][5.161:255]()
    std::thread::spawn(move || runtime.block_on(event_loop(threadsafe_functions, receiver)));
    [5.161]
    [4.2926]
    std::thread::spawn(move || runtime.block_on(event_loop(js_functions, receiver)));
  • file addition: js_function (d--r------)
    [2.138]
  • file move: threadsafe_function.rs (----------)mod.rs (----------)
    [0.435]
    [4.772]
  • replacement in editors/vscode/src/event_loop/js_function/mod.rs at line 5
    [4.833][4.833:866]()
    pub struct ThreadsafeFunctions {
    [4.833]
    [7.46]
    mod initialize_source_control;
    pub struct Functions {
  • replacement in editors/vscode/src/event_loop/js_function/mod.rs at line 12
    [4.968][4.968:995]()
    impl ThreadsafeFunctions {
    [4.968]
    [7.116]
    impl Functions {
  • edit in editors/vscode/src/event_loop/js_function/mod.rs at line 48
    [7.1049][7.1049:1673](),[7.1673][10.80:393](),[10.393][7.1770:2511](),[7.1770][7.1770:2511](),[6.1401][4.1525:1533](),[7.2511][4.1525:1533](),[4.1525][4.1525:1533]()
    mod initialize_source_control {
    use napi::bindgen_prelude::{FnArgs, FunctionCallContext};
    use crate::vscode_sys;
    pub type Arguments = (vscode_sys::reference::UriRef, String, String, String);
    pub type Return = (
    vscode_sys::reference::SourceControlRef,
    vscode_sys::reference::SourceControlResourceGroupRef,
    vscode_sys::reference::SourceControlResourceGroupRef,
    );
    pub type Prototype = napi::threadsafe_function::ThreadsafeFunction<
    FnArgs<Arguments>,
    Return,
    FnArgs<Arguments>,
    napi::Status,
    false,
    false,
    0,
    >;
    pub fn build(env: &napi::Env) -> Result<Prototype, napi::Error> {
    env.create_function_from_closure("initialize_source_control", callback)?
    .build_threadsafe_function()
    .build()
    }
    fn callback(function_call_context: FunctionCallContext) -> Result<Return, napi::Error> {
    let (repository_uri_ref, pijul_label, changes_label, untracked_label): Arguments =
    function_call_context.args()?;
    let source_control = vscode_sys::scm::create_source_control(
    function_call_context.env,
    "pijul",
    &pijul_label,
    &repository_uri_ref.get_inner(function_call_context.env)?,
    )?;
    let unrecorded_changes = source_control.create_resource_group("changes", &changes_label)?;
    let untracked_paths =
    source_control.create_resource_group("untracked", &untracked_label)?;
    Ok((
    source_control.create_ref()?,
    unrecorded_changes.create_ref()?,
    untracked_paths.create_ref()?,
    ))
    }
    }
  • file addition: initialize_source_control.rs (----------)
    [0.435]
    use napi::bindgen_prelude::{FnArgs, FunctionCallContext};
    use crate::vscode_sys;
    pub type Arguments = (vscode_sys::reference::UriRef, String, String, String);
    pub type Return = (
    vscode_sys::reference::SourceControlRef,
    vscode_sys::reference::SourceControlResourceGroupRef,
    vscode_sys::reference::SourceControlResourceGroupRef,
    );
    pub type Prototype = napi::threadsafe_function::ThreadsafeFunction<
    FnArgs<Arguments>,
    Return,
    FnArgs<Arguments>,
    napi::Status,
    false,
    false,
    0,
    >;
    pub fn build(env: &napi::Env) -> Result<Prototype, napi::Error> {
    env.create_function_from_closure("initialize_source_control", callback)?
    .build_threadsafe_function()
    .build()
    }
    fn callback(function_call_context: FunctionCallContext) -> Result<Return, napi::Error> {
    let (repository_uri_ref, pijul_label, changes_label, untracked_label): Arguments =
    function_call_context.args()?;
    let source_control = vscode_sys::scm::create_source_control(
    function_call_context.env,
    "pijul",
    &pijul_label,
    &repository_uri_ref.get_inner(function_call_context.env)?,
    )?;
    let unrecorded_changes = source_control.create_resource_group("changes", &changes_label)?;
    let untracked_paths = source_control.create_resource_group("untracked", &untracked_label)?;
    Ok((
    source_control.create_ref()?,
    unrecorded_changes.create_ref()?,
    untracked_paths.create_ref()?,
    ))
    }
  • replacement in editors/vscode/src/event_loop/event/open_workspace_folder.rs at line 7
    [8.516][8.516:581]()
    use crate::event_loop::threadsafe_function::ThreadsafeFunctions;
    [8.516]
    [8.581]
    use crate::event_loop::js_function::Functions;
  • replacement in editors/vscode/src/event_loop/event/open_workspace_folder.rs at line 9
    [8.582][8.582:647]()
    #[tracing::instrument(skip(repositories, threadsafe_functions))]
    [8.582]
    [8.647]
    #[tracing::instrument(skip(repositories, js_functions))]
  • replacement in editors/vscode/src/event_loop/event/open_workspace_folder.rs at line 13
    [8.744][8.744:792]()
    threadsafe_functions: &ThreadsafeFunctions,
    [8.744]
    [8.792]
    js_functions: &Functions,
  • replacement in editors/vscode/src/event_loop/event/open_workspace_folder.rs at line 85
    [9.2035][9.2035:2171]()
    let repository_uri = match threadsafe_functions
    .uri_file(repository_path.to_string())
    .await
    {
    [9.2035]
    [9.2171]
    let repository_uri = match js_functions.uri_file(repository_path.to_string()).await {
  • replacement in editors/vscode/src/event_loop/event/open_workspace_folder.rs at line 93
    [8.1915][9.2393:2488]()
    let (source_control, unrecorded_changes, untracked_paths) = match threadsafe_functions
    [8.1915]
    [9.2488]
    let (source_control, unrecorded_changes, untracked_paths) = match js_functions