From 1e08d1e0014c5c51cf807c529cc409874da2823e Mon Sep 17 00:00:00 2001 From: Oscar Beaumont Date: Fri, 8 May 2026 08:32:59 +0800 Subject: [PATCH] allow reuse of channels --- example/src/lib/bindings.ts | 4 +++- taurpc/src/export.rs | 24 +++++++++++++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/example/src/lib/bindings.ts b/example/src/lib/bindings.ts index f22b023..e22109c 100644 --- a/example/src/lib/bindings.ts +++ b/example/src/lib/bindings.ts @@ -1,6 +1,8 @@ // My header // This file has been generated by TauRPC. Do not edit this file manually. +import { Channel } from '@tauri-apps/api/core'; + export type Error = string; export type PhaseSpecificRename = PhaseSpecificRename_Serialize | PhaseSpecificRename_Deserialize; @@ -73,7 +75,7 @@ export const RESULT_MAP = { } }; -export const TRANSFORM_MAP = { "": { "semantic_types_event": { args: [(v) => ({...v,bytes:[...v.bytes]})], eventArgs: [(v) => ({...v,date:new Date(v.date),bytes:new Uint8Array(v.bytes),url:new URL(v.url)})], result: null }, "semantic_types": { args: [(v) => ({...v,bytes:[...v.bytes]}), (v) => { const transform = (response) => ({...response,date:new Date(response.date),bytes:new Uint8Array(response.bytes),url:new URL(response.url)}); if (typeof v === "function") return (response) => v(transform(response)); const onmessage = v.onmessage; v.onmessage = (response) => onmessage(transform(response)); return v }], eventArgs: [(v) => ({...v,date:new Date(v.date),bytes:new Uint8Array(v.bytes),url:new URL(v.url)}), null], result: (v) => ({...v,date:new Date(v.date),bytes:new Uint8Array(v.bytes),url:new URL(v.url)}) } } }; +export const TRANSFORM_MAP = { "": { "semantic_types_event": { args: [(v) => ({...v,bytes:[...v.bytes]})], eventArgs: [(v) => ({...v,date:new Date(v.date),bytes:new Uint8Array(v.bytes),url:new URL(v.url)})], result: null }, "semantic_types": { args: [(v) => ({...v,bytes:[...v.bytes]}), (v) => { const transform = (response) => ({...response,date:new Date(response.date),bytes:new Uint8Array(response.bytes),url:new URL(response.url)}); if (typeof v === "function") return (response) => v(transform(response)); return new Channel((response) => v.onmessage(transform(response))) }], eventArgs: [(v) => ({...v,date:new Date(v.date),bytes:new Uint8Array(v.bytes),url:new URL(v.url)}), null], result: (v) => ({...v,date:new Date(v.date),bytes:new Uint8Array(v.bytes),url:new URL(v.url)}) } } }; export type Router = { "": { diff --git a/taurpc/src/export.rs b/taurpc/src/export.rs index 1d968fc..2dfa95c 100644 --- a/taurpc/src/export.rs +++ b/taurpc/src/export.rs @@ -49,6 +49,10 @@ pub(super) fn export_types( .framework_runtime(move |mut exporter| { let mut out = String::new(); + if requires_channel_transform(&functions, &exporter, &export_runtime_for_runtime) { + out.push_str("import { Channel } from '@tauri-apps/api/core';\n\n"); + } + out.push_str(&exporter.render_types()?); out.push_str( @@ -379,6 +383,24 @@ fn apply_semantic_type_for_phase( } } +fn requires_channel_transform( + functions: &BTreeMap>, + exporter: &FrameworkExporter, + export_runtime: &ExportRuntimeConfig, +) -> bool { + if export_runtime.semantic_types.is_none() { + return false; + } + + functions.values().flatten().any(|function| { + function.args().iter().any(|(_, arg_dt)| { + tauri_channel_reference(arg_dt, exporter.types) + .and_then(|channel| named_reference_generics(channel).first()) + .is_some() + }) + }) +} + fn generate_transform_map( functions: &BTreeMap>, exporter: &FrameworkExporter, @@ -418,7 +440,7 @@ fn generate_transform_map( .filter(|runtime| runtime != "response") .map(|runtime| { format!( - "{{ const transform = (response) => {runtime}; if (typeof v === \"function\") return (response) => v(transform(response)); const onmessage = v.onmessage; v.onmessage = (response) => onmessage(transform(response)); return v }}" + "{{ const transform = (response) => {runtime}; if (typeof v === \"function\") return (response) => v(transform(response)); return new Channel((response) => v.onmessage(transform(response))) }}" ) }) } else {