Bind libmoq_ffi from the object's own metadata, not from its header
moq-ffi publishes MoQ over QUIC behind UniFFI's C ABI, prebuilt for both Linux architectures, which is the transport half of a call without the 440 crates that building it entails. This takes those bytes and declares them. The bindings are GENERATED from the .so rather than transcribed from the C header the release ships, because the two do not describe the same library: moq-ffi's `audio` and `video` features are on by default and are off in the Linux and Android artifacts, so the header has 230 entry points where our object has 206, with the whole moqaudio*/moqvideo* surface among the missing. Binding the header would have linked on a Mac and failed on both platforms frq ships to. UniFFI embeds its interface metadata in the object, so `just gen-moq` reads it back out and emits src/frq/moq/raw.clj — 403 entry points, none inferred: a ctype the generator does not know is reported and left unbound rather than given a plausible width, which would be a silent memory bug instead of a compile error. frq.moq.uniffi is the substrate: the RustBuffer and RustCallStatus layouts, the out-parameter wrapper nearly every call wears, UTF-8 in and out, and the future family. Async keeps frq.av's contract rather than bending it — the continuation tokio invokes from a thread jolt never started lives in an auto-arena, is :collect-safe, and does nothing but set an atom, so the loop thread polls a future exactly as pump! already polls the media plane. Nothing moves off libjoltmoq yet; both objects are declared, and frq.moq.smoke is what says the layouts are real -- contract version, a handle constructed and freed, and a 29-character string that is 33 bytes on the other side. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
9f081a1 parent: 7bc4770 modified
deps.edn +15 -1 | @@ -32,7 +32,21 @@ | ||
| 32 | 32 | :linux ["libvidya.so"]} |
| 33 | 33 | {:name "joltmoq" |
| 34 | 34 | :darwin ["libjoltmoq.dylib"] |
| 35 | - :linux ["libjoltmoq.so"]}] | |
| 35 | + :linux ["libjoltmoq.so"]} | |
| 36 | + ;; moq-ffi's own object, fetched from its release rather than | |
| 37 | + ;; built — see the flake. It is not a second media plane: it is | |
| 38 | + ;; the transport half alone, behind UniFFI's C ABI, and it is | |
| 39 | + ;; here so `frq.moq.*` has something to load while the port off | |
| 40 | + ;; libjoltmoq happens. Both are declared for now, and the day | |
| 41 | + ;; frq.av stops calling joltmoq_* is the day that entry goes. | |
| 42 | + ;; | |
| 43 | + ;; No :darwin — the release's Mac artifact is a DIFFERENT BUILD | |
| 44 | + ;; (moq-ffi's audio/video features are on there and off here), | |
| 45 | + ;; so naming a .dylib would load an object with 24 entry points | |
| 46 | + ;; the generated bindings do not describe. Linux and Android | |
| 47 | + ;; only, until they are built the same way. | |
| 48 | + {:name "moq_ffi" | |
| 49 | + :linux ["libmoq_ffi.so"]}] | |
| 36 | 50 | |
| 37 | 51 | :aliases {:frq {:main-opts ["-m" "frq.app"]} |
| 38 | 52 | |
| @@ -32,7 +32,21 @@ | |||
| 32 | :linux ["libvidya.so"]} | 32 | :linux ["libvidya.so"]} |
| 33 | {:name "joltmoq" | 33 | {:name "joltmoq" |
| 34 | :darwin ["libjoltmoq.dylib"] | 34 | :darwin ["libjoltmoq.dylib"] |
| 35 | - :linux ["libjoltmoq.so"]}] | 35 | + :linux ["libjoltmoq.so"]} |
| 36 | + ;; moq-ffi's own object, fetched from its release rather than | ||
| 37 | + ;; built — see the flake. It is not a second media plane: it is | ||
| 38 | + ;; the transport half alone, behind UniFFI's C ABI, and it is | ||
| 39 | + ;; here so `frq.moq.*` has something to load while the port off | ||
| 40 | + ;; libjoltmoq happens. Both are declared for now, and the day | ||
| 41 | + ;; frq.av stops calling joltmoq_* is the day that entry goes. | ||
| 42 | + ;; | ||
| 43 | + ;; No :darwin — the release's Mac artifact is a DIFFERENT BUILD | ||
| 44 | + ;; (moq-ffi's audio/video features are on there and off here), | ||
| 45 | + ;; so naming a .dylib would load an object with 24 entry points | ||
| 46 | + ;; the generated bindings do not describe. Linux and Android | ||
| 47 | + ;; only, until they are built the same way. | ||
| 48 | + {:name "moq_ffi" | ||
| 49 | + :linux ["libmoq_ffi.so"]}] | ||
| 36 | 50 | ||
| 37 | :aliases {:frq {:main-opts ["-m" "frq.app"]} | 51 | :aliases {:frq {:main-opts ["-m" "frq.app"]} |
| 38 | 52 | ||
modified
flake.nix +68 -5 | @@ -182,6 +182,69 @@ | ||
| 182 | 182 | # PipeWire's rather than raw ALSA PCMs. |
| 183 | 183 | native = jolt-native.packages.${pkgs.stdenv.hostPlatform.system}.default; |
| 184 | 184 | |
| 185 | + # libmoq_ffi — MoQ over QUIC behind UniFFI's C ABI, FETCHED rather | |
| 186 | + # than built. This is the object `frq.moq.raw` is generated from. | |
| 187 | + # | |
| 188 | + # Fetched because building it is the thing this whole exercise is | |
| 189 | + # about: moq-ffi pulls moq-native, iroh, quinn, rustls and aws-lc-sys | |
| 190 | + # behind it, which is 440 crates that nothing else in this tree | |
| 191 | + # needs. Upstream already publishes the object for both Linux | |
| 192 | + # architectures, so we take those bytes. | |
| 193 | + # | |
| 194 | + # Pinned to a release and to a hash, and the hashes below are | |
| 195 | + # upstream's own published .sha256 files rather than ones observed | |
| 196 | + # here — a `nix-prefetch` of whatever the URL serves today would | |
| 197 | + # record that it downloaded something, not that it downloaded the | |
| 198 | + # right thing. | |
| 199 | + # | |
| 200 | + # WHAT THIS BUILD IS NOT: moq-ffi's `audio` and `video` features are | |
| 201 | + # on by default upstream and are OFF in these artifacts, so there is | |
| 202 | + # no publish_audio/publish_video and no moqaudio*/moqvideo* here — | |
| 203 | + # 206 functions where the Apple artifact has 230. That is why the | |
| 204 | + # bindings are generated from the object (`just gen-moq`) and not | |
| 205 | + # from the C header the release ships, which describes the Apple one. | |
| 206 | + moqFfi = | |
| 207 | + let | |
| 208 | + version = "0.3.17"; | |
| 209 | + target = { | |
| 210 | + "x86_64-linux" = "x86_64-unknown-linux-gnu"; | |
| 211 | + "aarch64-linux" = "aarch64-unknown-linux-gnu"; | |
| 212 | + }.${pkgs.stdenv.hostPlatform.system}; | |
| 213 | + hash = { | |
| 214 | + "x86_64-linux" = "sha256-dzQXpV4JgdtD+g33WX51FFAQdfCUXkNsx1xPbobPfUI="; | |
| 215 | + "aarch64-linux" = "sha256-PdzRwbJFqOZWRgI0HHX2XUH+Ljh4V3jvQ9asfvCuIPA="; | |
| 216 | + }.${pkgs.stdenv.hostPlatform.system}; | |
| 217 | + in | |
| 218 | + pkgs.stdenv.mkDerivation { | |
| 219 | + pname = "libmoq-ffi"; | |
| 220 | + inherit version; | |
| 221 | + src = pkgs.fetchurl { | |
| 222 | + url = "https://github.com/kixelated/moq/releases/download/moq-ffi-v${version}/moq-ffi-${version}-${target}-libmoq_ffi.so"; | |
| 223 | + inherit hash; | |
| 224 | + }; | |
| 225 | + dontUnpack = true; | |
| 226 | + # It carries no RUNPATH and needs libgcc_s, libm and libc — the | |
| 227 | + # host's on an ordinary distro, and nothing at all on NixOS | |
| 228 | + # unless they are bound here. | |
| 229 | + nativeBuildInputs = [ pkgs.autoPatchelfHook ]; | |
| 230 | + buildInputs = [ pkgs.stdenv.cc.cc.lib ]; | |
| 231 | + installPhase = '' | |
| 232 | + mkdir -p $out/lib | |
| 233 | + cp $src $out/lib/libmoq_ffi.so | |
| 234 | + chmod +w $out/lib/libmoq_ffi.so | |
| 235 | + ''; | |
| 236 | + }; | |
| 237 | + | |
| 238 | + # One directory for the loader to look in. jolt resolves every | |
| 239 | + # :jolt/native name against JOLT_NATIVE_LIB, and the objects now come | |
| 240 | + # from two places — jolt-native's flake, and the moq-ffi release — so | |
| 241 | + # they are joined rather than the path being made a list, which the | |
| 242 | + # loader does not take. | |
| 243 | + nativeAll = pkgs.symlinkJoin { | |
| 244 | + name = "frq-native"; | |
| 245 | + paths = [ native moqFfi ]; | |
| 246 | + }; | |
| 247 | + | |
| 185 | 248 | # Jolt itself: Clojure on Chez, built the way its own flake builds it. |
| 186 | 249 | # A function, because there are two of them — upstream for the |
| 187 | 250 | # desktop, and the Bionic-addrinfo fork for the boot image the APK |
| @@ -253,7 +316,7 @@ | ||
| 253 | 316 | # read-only directory and jolt treats that as a quiet cache miss, so |
| 254 | 317 | # the only cost is re-resolving the (already local) graph per start. |
| 255 | 318 | frqScript = pkgs.writeShellScript "frq" '' |
| 256 | - export LD_LIBRARY_PATH="${native}/lib:${lib.makeLibraryPath runtimeLibs}''${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" | |
| 319 | + export LD_LIBRARY_PATH="${nativeAll}/lib:${lib.makeLibraryPath runtimeLibs}''${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" | |
| 257 | 320 | cd ${frqSource} |
| 258 | 321 | |
| 259 | 322 | # On NixOS the store's Mesa is the system's and the window opens. |
| @@ -271,7 +334,7 @@ | ||
| 271 | 334 | # a terminal is the one surface that needs nothing from the host but |
| 272 | 335 | # a terminal, which is the reason this output exists. |
| 273 | 336 | tuiScript = pkgs.writeShellScript "frq-tui" '' |
| 274 | - export LD_LIBRARY_PATH="${native}/lib''${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" | |
| 337 | + export LD_LIBRARY_PATH="${nativeAll}/lib''${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" | |
| 275 | 338 | cd ${frqSource} |
| 276 | 339 | |
| 277 | 340 | exec ${joltRuntime}/bin/jolt \ |
| @@ -334,7 +397,7 @@ | ||
| 334 | 397 | }; |
| 335 | 398 | in |
| 336 | 399 | { |
| 337 | - inherit native frq; | |
| 400 | + inherit native moqFfi nativeAll frq; | |
| 338 | 401 | inherit tui; |
| 339 | 402 | jolt = joltRuntime; |
| 340 | 403 | default = frq; |
| @@ -380,7 +443,7 @@ | ||
| 380 | 443 | devShells = forEachSystem (pkgs: |
| 381 | 444 | let |
| 382 | 445 | inherit (pkgs) lib; |
| 383 | - inherit (self.packages.${pkgs.stdenv.hostPlatform.system}) jolt native; | |
| 446 | + inherit (self.packages.${pkgs.stdenv.hostPlatform.system}) jolt native nativeAll; | |
| 384 | 447 | in |
| 385 | 448 | { |
| 386 | 449 | default = pkgs.mkShellNoCC { |
| @@ -397,7 +460,7 @@ | ||
| 397 | 460 | # source `just run` runs is the working tree, so the launcher has |
| 398 | 461 | # to live in that tree and the shell has to hand it its answers. |
| 399 | 462 | # Naming these is also what makes the shell build them. |
| 400 | - JOLT_NATIVE_LIB = "${native}/lib"; | |
| 463 | + JOLT_NATIVE_LIB = "${nativeAll}/lib"; | |
| 401 | 464 | GLIMMER_SRC = glimmer; |
| 402 | 465 | GLIMMER_VIDYA_SRC = "${jolt-native}/glimmer-backends/glimmer-vidya"; |
| 403 | 466 | GLIMMER_TUI_SRC = "${jolt-native}/glimmer-backends/glimmer-tui"; |
| @@ -182,6 +182,69 @@ | |||
| 182 | # PipeWire's rather than raw ALSA PCMs. | 182 | # PipeWire's rather than raw ALSA PCMs. |
| 183 | native = jolt-native.packages.${pkgs.stdenv.hostPlatform.system}.default; | 183 | native = jolt-native.packages.${pkgs.stdenv.hostPlatform.system}.default; |
| 184 | 184 | ||
| 185 | + # libmoq_ffi — MoQ over QUIC behind UniFFI's C ABI, FETCHED rather | ||
| 186 | + # than built. This is the object `frq.moq.raw` is generated from. | ||
| 187 | + # | ||
| 188 | + # Fetched because building it is the thing this whole exercise is | ||
| 189 | + # about: moq-ffi pulls moq-native, iroh, quinn, rustls and aws-lc-sys | ||
| 190 | + # behind it, which is 440 crates that nothing else in this tree | ||
| 191 | + # needs. Upstream already publishes the object for both Linux | ||
| 192 | + # architectures, so we take those bytes. | ||
| 193 | + # | ||
| 194 | + # Pinned to a release and to a hash, and the hashes below are | ||
| 195 | + # upstream's own published .sha256 files rather than ones observed | ||
| 196 | + # here — a `nix-prefetch` of whatever the URL serves today would | ||
| 197 | + # record that it downloaded something, not that it downloaded the | ||
| 198 | + # right thing. | ||
| 199 | + # | ||
| 200 | + # WHAT THIS BUILD IS NOT: moq-ffi's `audio` and `video` features are | ||
| 201 | + # on by default upstream and are OFF in these artifacts, so there is | ||
| 202 | + # no publish_audio/publish_video and no moqaudio*/moqvideo* here — | ||
| 203 | + # 206 functions where the Apple artifact has 230. That is why the | ||
| 204 | + # bindings are generated from the object (`just gen-moq`) and not | ||
| 205 | + # from the C header the release ships, which describes the Apple one. | ||
| 206 | + moqFfi = | ||
| 207 | + let | ||
| 208 | + version = "0.3.17"; | ||
| 209 | + target = { | ||
| 210 | + "x86_64-linux" = "x86_64-unknown-linux-gnu"; | ||
| 211 | + "aarch64-linux" = "aarch64-unknown-linux-gnu"; | ||
| 212 | + }.${pkgs.stdenv.hostPlatform.system}; | ||
| 213 | + hash = { | ||
| 214 | + "x86_64-linux" = "sha256-dzQXpV4JgdtD+g33WX51FFAQdfCUXkNsx1xPbobPfUI="; | ||
| 215 | + "aarch64-linux" = "sha256-PdzRwbJFqOZWRgI0HHX2XUH+Ljh4V3jvQ9asfvCuIPA="; | ||
| 216 | + }.${pkgs.stdenv.hostPlatform.system}; | ||
| 217 | + in | ||
| 218 | + pkgs.stdenv.mkDerivation { | ||
| 219 | + pname = "libmoq-ffi"; | ||
| 220 | + inherit version; | ||
| 221 | + src = pkgs.fetchurl { | ||
| 222 | + url = "https://github.com/kixelated/moq/releases/download/moq-ffi-v${version}/moq-ffi-${version}-${target}-libmoq_ffi.so"; | ||
| 223 | + inherit hash; | ||
| 224 | + }; | ||
| 225 | + dontUnpack = true; | ||
| 226 | + # It carries no RUNPATH and needs libgcc_s, libm and libc — the | ||
| 227 | + # host's on an ordinary distro, and nothing at all on NixOS | ||
| 228 | + # unless they are bound here. | ||
| 229 | + nativeBuildInputs = [ pkgs.autoPatchelfHook ]; | ||
| 230 | + buildInputs = [ pkgs.stdenv.cc.cc.lib ]; | ||
| 231 | + installPhase = '' | ||
| 232 | + mkdir -p $out/lib | ||
| 233 | + cp $src $out/lib/libmoq_ffi.so | ||
| 234 | + chmod +w $out/lib/libmoq_ffi.so | ||
| 235 | + ''; | ||
| 236 | + }; | ||
| 237 | + | ||
| 238 | + # One directory for the loader to look in. jolt resolves every | ||
| 239 | + # :jolt/native name against JOLT_NATIVE_LIB, and the objects now come | ||
| 240 | + # from two places — jolt-native's flake, and the moq-ffi release — so | ||
| 241 | + # they are joined rather than the path being made a list, which the | ||
| 242 | + # loader does not take. | ||
| 243 | + nativeAll = pkgs.symlinkJoin { | ||
| 244 | + name = "frq-native"; | ||
| 245 | + paths = [ native moqFfi ]; | ||
| 246 | + }; | ||
| 247 | + | ||
| 185 | # Jolt itself: Clojure on Chez, built the way its own flake builds it. | 248 | # Jolt itself: Clojure on Chez, built the way its own flake builds it. |
| 186 | # A function, because there are two of them — upstream for the | 249 | # A function, because there are two of them — upstream for the |
| 187 | # desktop, and the Bionic-addrinfo fork for the boot image the APK | 250 | # desktop, and the Bionic-addrinfo fork for the boot image the APK |
| @@ -253,7 +316,7 @@ | |||
| 253 | # read-only directory and jolt treats that as a quiet cache miss, so | 316 | # read-only directory and jolt treats that as a quiet cache miss, so |
| 254 | # the only cost is re-resolving the (already local) graph per start. | 317 | # the only cost is re-resolving the (already local) graph per start. |
| 255 | frqScript = pkgs.writeShellScript "frq" '' | 318 | frqScript = pkgs.writeShellScript "frq" '' |
| 256 | - export LD_LIBRARY_PATH="${native}/lib:${lib.makeLibraryPath runtimeLibs}''${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" | 319 | + export LD_LIBRARY_PATH="${nativeAll}/lib:${lib.makeLibraryPath runtimeLibs}''${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" |
| 257 | cd ${frqSource} | 320 | cd ${frqSource} |
| 258 | 321 | ||
| 259 | # On NixOS the store's Mesa is the system's and the window opens. | 322 | # On NixOS the store's Mesa is the system's and the window opens. |
| @@ -271,7 +334,7 @@ | |||
| 271 | # a terminal is the one surface that needs nothing from the host but | 334 | # a terminal is the one surface that needs nothing from the host but |
| 272 | # a terminal, which is the reason this output exists. | 335 | # a terminal, which is the reason this output exists. |
| 273 | tuiScript = pkgs.writeShellScript "frq-tui" '' | 336 | tuiScript = pkgs.writeShellScript "frq-tui" '' |
| 274 | - export LD_LIBRARY_PATH="${native}/lib''${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" | 337 | + export LD_LIBRARY_PATH="${nativeAll}/lib''${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" |
| 275 | cd ${frqSource} | 338 | cd ${frqSource} |
| 276 | 339 | ||
| 277 | exec ${joltRuntime}/bin/jolt \ | 340 | exec ${joltRuntime}/bin/jolt \ |
| @@ -334,7 +397,7 @@ | |||
| 334 | }; | 397 | }; |
| 335 | in | 398 | in |
| 336 | { | 399 | { |
| 337 | - inherit native frq; | 400 | + inherit native moqFfi nativeAll frq; |
| 338 | inherit tui; | 401 | inherit tui; |
| 339 | jolt = joltRuntime; | 402 | jolt = joltRuntime; |
| 340 | default = frq; | 403 | default = frq; |
| @@ -380,7 +443,7 @@ | |||
| 380 | devShells = forEachSystem (pkgs: | 443 | devShells = forEachSystem (pkgs: |
| 381 | let | 444 | let |
| 382 | inherit (pkgs) lib; | 445 | inherit (pkgs) lib; |
| 383 | - inherit (self.packages.${pkgs.stdenv.hostPlatform.system}) jolt native; | 446 | + inherit (self.packages.${pkgs.stdenv.hostPlatform.system}) jolt native nativeAll; |
| 384 | in | 447 | in |
| 385 | { | 448 | { |
| 386 | default = pkgs.mkShellNoCC { | 449 | default = pkgs.mkShellNoCC { |
| @@ -397,7 +460,7 @@ | |||
| 397 | # source `just run` runs is the working tree, so the launcher has | 460 | # source `just run` runs is the working tree, so the launcher has |
| 398 | # to live in that tree and the shell has to hand it its answers. | 461 | # to live in that tree and the shell has to hand it its answers. |
| 399 | # Naming these is also what makes the shell build them. | 462 | # Naming these is also what makes the shell build them. |
| 400 | - JOLT_NATIVE_LIB = "${native}/lib"; | 463 | + JOLT_NATIVE_LIB = "${nativeAll}/lib"; |
| 401 | GLIMMER_SRC = glimmer; | 464 | GLIMMER_SRC = glimmer; |
| 402 | GLIMMER_VIDYA_SRC = "${jolt-native}/glimmer-backends/glimmer-vidya"; | 465 | GLIMMER_VIDYA_SRC = "${jolt-native}/glimmer-backends/glimmer-vidya"; |
| 403 | GLIMMER_TUI_SRC = "${jolt-native}/glimmer-backends/glimmer-tui"; | 466 | GLIMMER_TUI_SRC = "${jolt-native}/glimmer-backends/glimmer-tui"; |
modified
justfile +45 -0 | @@ -209,3 +209,48 @@ repl *args: | ||
| 209 | 209 | export LD_LIBRARY_PATH="$JOLT_NATIVE_LIB:$FRQ_LIB_PATH${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" |
| 210 | 210 | |
| 211 | 211 | exec jolt -Sdeps "$deps" "$@" |
| 212 | + | |
| 213 | +# Regenerate src/frq/moq/raw.clj from the libmoq_ffi we actually load. | |
| 214 | +# | |
| 215 | +# UniFFI embeds its interface metadata in the object, so `uniffi-bindgen | |
| 216 | +# --library` reads the truth out of the .so rather than a header shipped | |
| 217 | +# beside it — which for this release is a different build entirely (the Apple | |
| 218 | +# artifact has moq-ffi's `audio` and `video` features, Linux and Android do | |
| 219 | +# not). Binding the header would link on a Mac and fail on both platforms frq | |
| 220 | +# ships to, so the object is the only source this recipe will accept. | |
| 221 | +# | |
| 222 | +# The bindgen must match the uniffi that built the object — 0.32 for moq-ffi | |
| 223 | +# 0.3.17 — and it is built once into the scratch dir rather than pinned into | |
| 224 | +# the flake: nothing in a normal build needs it, and a regeneration is a thing | |
| 225 | +# done when the moq-ffi pin moves, by hand, on purpose. | |
| 226 | +# | |
| 227 | +# just gen-moq # the loaded library | |
| 228 | +# just gen-moq path/to/libmoq_ffi.so | |
| 229 | +# | |
| 230 | +# Regenerate the libmoq_ffi bindings from the object's own embedded metadata. | |
| 231 | +gen-moq lib="": | |
| 232 | + #!/usr/bin/env bash | |
| 233 | + set -euo pipefail | |
| 234 | + lib="${1:-${JOLT_NATIVE_LIB:-}/libmoq_ffi.so}" | |
| 235 | + [ -f "$lib" ] || { echo "no libmoq_ffi.so at $lib — pass one: just gen-moq <path>" >&2; exit 1; } | |
| 236 | + work="${TMPDIR:-/tmp}/frq-gen-moq" | |
| 237 | + mkdir -p "$work/ubg/src" | |
| 238 | + cat > "$work/ubg/Cargo.toml" <<'TOML' | |
| 239 | + [package] | |
| 240 | + name = "ubg" | |
| 241 | + version = "0.1.0" | |
| 242 | + edition = "2021" | |
| 243 | + [[bin]] | |
| 244 | + name = "uniffi-bindgen" | |
| 245 | + path = "src/main.rs" | |
| 246 | + [dependencies] | |
| 247 | + uniffi = { version = "0.32", features = ["cli"] } | |
| 248 | + TOML | |
| 249 | + echo 'fn main() { uniffi::uniffi_bindgen_main() }' > "$work/ubg/src/main.rs" | |
| 250 | + ( cd "$work/ubg" && cargo build --release -q ) | |
| 251 | + ( cd "$work/ubg" && ./target/release/uniffi-bindgen generate \ | |
| 252 | + --library "$lib" --language python --out-dir "$work/py" --no-format ) | |
| 253 | + python3 tools/py2jolt.py "$work"/py/*.py > "$work/body.clj" | |
| 254 | + { sed -n '1,/^ (:require \[jolt.ffi :as ffi\]))$/p' src/frq/moq/raw.clj; echo; cat "$work/body.clj"; } > "$work/raw.clj" | |
| 255 | + mv "$work/raw.clj" src/frq/moq/raw.clj | |
| 256 | + echo "wrote src/frq/moq/raw.clj ($(grep -c '^(ffi/defcfn' src/frq/moq/raw.clj) entry points)" | |
| @@ -209,3 +209,48 @@ repl *args: | |||
| 209 | export LD_LIBRARY_PATH="$JOLT_NATIVE_LIB:$FRQ_LIB_PATH${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" | 209 | export LD_LIBRARY_PATH="$JOLT_NATIVE_LIB:$FRQ_LIB_PATH${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" |
| 210 | 210 | ||
| 211 | exec jolt -Sdeps "$deps" "$@" | 211 | exec jolt -Sdeps "$deps" "$@" |
| 212 | + | ||
| 213 | +# Regenerate src/frq/moq/raw.clj from the libmoq_ffi we actually load. | ||
| 214 | +# | ||
| 215 | +# UniFFI embeds its interface metadata in the object, so `uniffi-bindgen | ||
| 216 | +# --library` reads the truth out of the .so rather than a header shipped | ||
| 217 | +# beside it — which for this release is a different build entirely (the Apple | ||
| 218 | +# artifact has moq-ffi's `audio` and `video` features, Linux and Android do | ||
| 219 | +# not). Binding the header would link on a Mac and fail on both platforms frq | ||
| 220 | +# ships to, so the object is the only source this recipe will accept. | ||
| 221 | +# | ||
| 222 | +# The bindgen must match the uniffi that built the object — 0.32 for moq-ffi | ||
| 223 | +# 0.3.17 — and it is built once into the scratch dir rather than pinned into | ||
| 224 | +# the flake: nothing in a normal build needs it, and a regeneration is a thing | ||
| 225 | +# done when the moq-ffi pin moves, by hand, on purpose. | ||
| 226 | +# | ||
| 227 | +# just gen-moq # the loaded library | ||
| 228 | +# just gen-moq path/to/libmoq_ffi.so | ||
| 229 | +# | ||
| 230 | +# Regenerate the libmoq_ffi bindings from the object's own embedded metadata. | ||
| 231 | +gen-moq lib="": | ||
| 232 | + #!/usr/bin/env bash | ||
| 233 | + set -euo pipefail | ||
| 234 | + lib="${1:-${JOLT_NATIVE_LIB:-}/libmoq_ffi.so}" | ||
| 235 | + [ -f "$lib" ] || { echo "no libmoq_ffi.so at $lib — pass one: just gen-moq <path>" >&2; exit 1; } | ||
| 236 | + work="${TMPDIR:-/tmp}/frq-gen-moq" | ||
| 237 | + mkdir -p "$work/ubg/src" | ||
| 238 | + cat > "$work/ubg/Cargo.toml" <<'TOML' | ||
| 239 | + [package] | ||
| 240 | + name = "ubg" | ||
| 241 | + version = "0.1.0" | ||
| 242 | + edition = "2021" | ||
| 243 | + [[bin]] | ||
| 244 | + name = "uniffi-bindgen" | ||
| 245 | + path = "src/main.rs" | ||
| 246 | + [dependencies] | ||
| 247 | + uniffi = { version = "0.32", features = ["cli"] } | ||
| 248 | + TOML | ||
| 249 | + echo 'fn main() { uniffi::uniffi_bindgen_main() }' > "$work/ubg/src/main.rs" | ||
| 250 | + ( cd "$work/ubg" && cargo build --release -q ) | ||
| 251 | + ( cd "$work/ubg" && ./target/release/uniffi-bindgen generate \ | ||
| 252 | + --library "$lib" --language python --out-dir "$work/py" --no-format ) | ||
| 253 | + python3 tools/py2jolt.py "$work"/py/*.py > "$work/body.clj" | ||
| 254 | + { sed -n '1,/^ (:require \[jolt.ffi :as ffi\]))$/p' src/frq/moq/raw.clj; echo; cat "$work/body.clj"; } > "$work/raw.clj" | ||
| 255 | + mv "$work/raw.clj" src/frq/moq/raw.clj | ||
| 256 | + echo "wrote src/frq/moq/raw.clj ($(grep -c '^(ffi/defcfn' src/frq/moq/raw.clj) entry points)" | ||
added
src/frq/moq/raw.clj +439 -0 | new file mode 100644 | ||
| @@ -0,0 +1,439 @@ | ||
| 1 | +(ns frq.moq.raw | |
| 2 | + "Every entry point in libmoq_ffi, declared. GENERATED — do not edit. | |
| 3 | + | |
| 4 | + just gen-moq | |
| 5 | + | |
| 6 | + These are not transcribed from a header. UniFFI embeds its interface | |
| 7 | + metadata in the object itself, and `uniffi-bindgen --library` reads it back | |
| 8 | + out, so what is declared here is what the .so we ship actually exports — | |
| 9 | + which matters more than it sounds. The release's Apple artifact and its | |
| 10 | + Linux/Android ones are *different builds*: moq-ffi's `audio` and `video` | |
| 11 | + features are on by default and were switched off for Linux and Android, so | |
| 12 | + the shipped C header describes 230 entry points where the object we load has | |
| 13 | + 403 symbols covering 206 functions, with `publish_audio`, `publish_video` | |
| 14 | + and the whole `moqaudio*`/`moqvideo*` surface absent. Binding the header | |
| 15 | + would have produced calls that link on a Mac and fail on the two platforms | |
| 16 | + frq targets. | |
| 17 | + | |
| 18 | + Nothing here is hand-written and nothing is inferred. The generator maps a | |
| 19 | + ctype it does not recognise to nothing at all and reports it, rather than | |
| 20 | + guessing a width — a wrong one would be a silent memory bug rather than a | |
| 21 | + compile error. | |
| 22 | + | |
| 23 | + Two shapes recur, and both are spelled out in full at every call site rather | |
| 24 | + than named: `defcfn` is a macro whose types Chez fixes when it COMPILES the | |
| 25 | + foreign procedure, so a `def`'d descriptor in type position has nothing to | |
| 26 | + compile. Hence the literal [:by-value [:struct ...]] repeated throughout — | |
| 27 | + it is the RustBuffer {capacity, len, data} triple, or the ForeignBytes pair. | |
| 28 | + | |
| 29 | + A trailing :pointer on a non-async function is its `RustCallStatus *` | |
| 30 | + out-parameter; `frq.moq.uniffi/with-out-status` is what supplies one. An | |
| 31 | + async function has no status and answers a future handle instead — poll it | |
| 32 | + through `frq.moq.uniffi/start-future`. | |
| 33 | + | |
| 34 | + Generated from moq-ffi 0.3.17, UniFFI contract 30." | |
| 35 | + (:require [jolt.ffi :as ffi])) | |
| 36 | + | |
| 37 | +(ffi/defcfn rust-future-cancel-f32 "ffi_moq_ffi_rust_future_cancel_f32" [:uint64] :void) | |
| 38 | +(ffi/defcfn rust-future-cancel-f64 "ffi_moq_ffi_rust_future_cancel_f64" [:uint64] :void) | |
| 39 | +(ffi/defcfn rust-future-cancel-i16 "ffi_moq_ffi_rust_future_cancel_i16" [:uint64] :void) | |
| 40 | +(ffi/defcfn rust-future-cancel-i32 "ffi_moq_ffi_rust_future_cancel_i32" [:uint64] :void) | |
| 41 | +(ffi/defcfn rust-future-cancel-i64 "ffi_moq_ffi_rust_future_cancel_i64" [:uint64] :void) | |
| 42 | +(ffi/defcfn rust-future-cancel-i8 "ffi_moq_ffi_rust_future_cancel_i8" [:uint64] :void) | |
| 43 | +(ffi/defcfn rust-future-cancel-rust-buffer "ffi_moq_ffi_rust_future_cancel_rust_buffer" [:uint64] :void) | |
| 44 | +(ffi/defcfn rust-future-cancel-u16 "ffi_moq_ffi_rust_future_cancel_u16" [:uint64] :void) | |
| 45 | +(ffi/defcfn rust-future-cancel-u32 "ffi_moq_ffi_rust_future_cancel_u32" [:uint64] :void) | |
| 46 | +(ffi/defcfn rust-future-cancel-u64 "ffi_moq_ffi_rust_future_cancel_u64" [:uint64] :void) | |
| 47 | +(ffi/defcfn rust-future-cancel-u8 "ffi_moq_ffi_rust_future_cancel_u8" [:uint64] :void) | |
| 48 | +(ffi/defcfn rust-future-cancel-void "ffi_moq_ffi_rust_future_cancel_void" [:uint64] :void) | |
| 49 | +(ffi/defcfn rust-future-complete-f32 "ffi_moq_ffi_rust_future_complete_f32" [:uint64 :pointer] :float) | |
| 50 | +(ffi/defcfn rust-future-complete-f64 "ffi_moq_ffi_rust_future_complete_f64" [:uint64 :pointer] :double) | |
| 51 | +(ffi/defcfn rust-future-complete-i16 "ffi_moq_ffi_rust_future_complete_i16" [:uint64 :pointer] :int16) | |
| 52 | +(ffi/defcfn rust-future-complete-i32 "ffi_moq_ffi_rust_future_complete_i32" [:uint64 :pointer] :int32) | |
| 53 | +(ffi/defcfn rust-future-complete-i64 "ffi_moq_ffi_rust_future_complete_i64" [:uint64 :pointer] :int64) | |
| 54 | +(ffi/defcfn rust-future-complete-i8 "ffi_moq_ffi_rust_future_complete_i8" [:uint64 :pointer] :int8) | |
| 55 | +(ffi/defcfn rust-future-complete-rust-buffer "ffi_moq_ffi_rust_future_complete_rust_buffer" [:uint64 :pointer] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]) | |
| 56 | +(ffi/defcfn rust-future-complete-u16 "ffi_moq_ffi_rust_future_complete_u16" [:uint64 :pointer] :uint16) | |
| 57 | +(ffi/defcfn rust-future-complete-u32 "ffi_moq_ffi_rust_future_complete_u32" [:uint64 :pointer] :uint32) | |
| 58 | +(ffi/defcfn rust-future-complete-u64 "ffi_moq_ffi_rust_future_complete_u64" [:uint64 :pointer] :uint64) | |
| 59 | +(ffi/defcfn rust-future-complete-u8 "ffi_moq_ffi_rust_future_complete_u8" [:uint64 :pointer] :uint8) | |
| 60 | +(ffi/defcfn rust-future-complete-void "ffi_moq_ffi_rust_future_complete_void" [:uint64 :pointer] :void) | |
| 61 | +(ffi/defcfn rust-future-free-f32 "ffi_moq_ffi_rust_future_free_f32" [:uint64] :void) | |
| 62 | +(ffi/defcfn rust-future-free-f64 "ffi_moq_ffi_rust_future_free_f64" [:uint64] :void) | |
| 63 | +(ffi/defcfn rust-future-free-i16 "ffi_moq_ffi_rust_future_free_i16" [:uint64] :void) | |
| 64 | +(ffi/defcfn rust-future-free-i32 "ffi_moq_ffi_rust_future_free_i32" [:uint64] :void) | |
| 65 | +(ffi/defcfn rust-future-free-i64 "ffi_moq_ffi_rust_future_free_i64" [:uint64] :void) | |
| 66 | +(ffi/defcfn rust-future-free-i8 "ffi_moq_ffi_rust_future_free_i8" [:uint64] :void) | |
| 67 | +(ffi/defcfn rust-future-free-rust-buffer "ffi_moq_ffi_rust_future_free_rust_buffer" [:uint64] :void) | |
| 68 | +(ffi/defcfn rust-future-free-u16 "ffi_moq_ffi_rust_future_free_u16" [:uint64] :void) | |
| 69 | +(ffi/defcfn rust-future-free-u32 "ffi_moq_ffi_rust_future_free_u32" [:uint64] :void) | |
| 70 | +(ffi/defcfn rust-future-free-u64 "ffi_moq_ffi_rust_future_free_u64" [:uint64] :void) | |
| 71 | +(ffi/defcfn rust-future-free-u8 "ffi_moq_ffi_rust_future_free_u8" [:uint64] :void) | |
| 72 | +(ffi/defcfn rust-future-free-void "ffi_moq_ffi_rust_future_free_void" [:uint64] :void) | |
| 73 | +(ffi/defcfn rust-future-poll-f32 "ffi_moq_ffi_rust_future_poll_f32" [:uint64 :pointer :uint64] :void) | |
| 74 | +(ffi/defcfn rust-future-poll-f64 "ffi_moq_ffi_rust_future_poll_f64" [:uint64 :pointer :uint64] :void) | |
| 75 | +(ffi/defcfn rust-future-poll-i16 "ffi_moq_ffi_rust_future_poll_i16" [:uint64 :pointer :uint64] :void) | |
| 76 | +(ffi/defcfn rust-future-poll-i32 "ffi_moq_ffi_rust_future_poll_i32" [:uint64 :pointer :uint64] :void) | |
| 77 | +(ffi/defcfn rust-future-poll-i64 "ffi_moq_ffi_rust_future_poll_i64" [:uint64 :pointer :uint64] :void) | |
| 78 | +(ffi/defcfn rust-future-poll-i8 "ffi_moq_ffi_rust_future_poll_i8" [:uint64 :pointer :uint64] :void) | |
| 79 | +(ffi/defcfn rust-future-poll-rust-buffer "ffi_moq_ffi_rust_future_poll_rust_buffer" [:uint64 :pointer :uint64] :void) | |
| 80 | +(ffi/defcfn rust-future-poll-u16 "ffi_moq_ffi_rust_future_poll_u16" [:uint64 :pointer :uint64] :void) | |
| 81 | +(ffi/defcfn rust-future-poll-u32 "ffi_moq_ffi_rust_future_poll_u32" [:uint64 :pointer :uint64] :void) | |
| 82 | +(ffi/defcfn rust-future-poll-u64 "ffi_moq_ffi_rust_future_poll_u64" [:uint64 :pointer :uint64] :void) | |
| 83 | +(ffi/defcfn rust-future-poll-u8 "ffi_moq_ffi_rust_future_poll_u8" [:uint64 :pointer :uint64] :void) | |
| 84 | +(ffi/defcfn rust-future-poll-void "ffi_moq_ffi_rust_future_poll_void" [:uint64 :pointer :uint64] :void) | |
| 85 | +(ffi/defcfn rustbuffer-alloc "ffi_moq_ffi_rustbuffer_alloc" [:uint64 :pointer] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]) | |
| 86 | +(ffi/defcfn rustbuffer-free "ffi_moq_ffi_rustbuffer_free" [[:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | |
| 87 | +(ffi/defcfn rustbuffer-from-bytes "ffi_moq_ffi_rustbuffer_from_bytes" [[:by-value [:struct [[:len :int32] [:data :pointer]]]] :pointer] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]) | |
| 88 | +(ffi/defcfn rustbuffer-reserve "ffi_moq_ffi_rustbuffer_reserve" [[:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :uint64 :pointer] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]) | |
| 89 | +(ffi/defcfn uniffi-contract-version "ffi_moq_ffi_uniffi_contract_version" [] :uint32) | |
| 90 | +(ffi/defcfn checksum-constructor-moqbroadcastproducer-new "uniffi_moq_ffi_checksum_constructor_moqbroadcastproducer_new" [] :uint16) | |
| 91 | +(ffi/defcfn checksum-constructor-moqclient-new "uniffi_moq_ffi_checksum_constructor_moqclient_new" [] :uint16) | |
| 92 | +(ffi/defcfn checksum-constructor-moqoriginproducer-new "uniffi_moq_ffi_checksum_constructor_moqoriginproducer_new" [] :uint16) | |
| 93 | +(ffi/defcfn checksum-constructor-moqserver-new "uniffi_moq_ffi_checksum_constructor_moqserver_new" [] :uint16) | |
| 94 | +(ffi/defcfn checksum-func-moq-log-level "uniffi_moq_ffi_checksum_func_moq_log_level" [] :uint16) | |
| 95 | +(ffi/defcfn checksum-method-moqannounced-cancel "uniffi_moq_ffi_checksum_method_moqannounced_cancel" [] :uint16) | |
| 96 | +(ffi/defcfn checksum-method-moqannounced-next "uniffi_moq_ffi_checksum_method_moqannounced_next" [] :uint16) | |
| 97 | +(ffi/defcfn checksum-method-moqannouncedbroadcast-available "uniffi_moq_ffi_checksum_method_moqannouncedbroadcast_available" [] :uint16) | |
| 98 | +(ffi/defcfn checksum-method-moqannouncedbroadcast-cancel "uniffi_moq_ffi_checksum_method_moqannouncedbroadcast_cancel" [] :uint16) | |
| 99 | +(ffi/defcfn checksum-method-moqannouncement-broadcast "uniffi_moq_ffi_checksum_method_moqannouncement_broadcast" [] :uint16) | |
| 100 | +(ffi/defcfn checksum-method-moqannouncement-path "uniffi_moq_ffi_checksum_method_moqannouncement_path" [] :uint16) | |
| 101 | +(ffi/defcfn checksum-method-moqbroadcastconsumer-fetch-group "uniffi_moq_ffi_checksum_method_moqbroadcastconsumer_fetch_group" [] :uint16) | |
| 102 | +(ffi/defcfn checksum-method-moqbroadcastconsumer-fetch-media-group "uniffi_moq_ffi_checksum_method_moqbroadcastconsumer_fetch_media_group" [] :uint16) | |
| 103 | +(ffi/defcfn checksum-method-moqbroadcastconsumer-route "uniffi_moq_ffi_checksum_method_moqbroadcastconsumer_route" [] :uint16) | |
| 104 | +(ffi/defcfn checksum-method-moqbroadcastconsumer-route-updates "uniffi_moq_ffi_checksum_method_moqbroadcastconsumer_route_updates" [] :uint16) | |
| 105 | +(ffi/defcfn checksum-method-moqbroadcastconsumer-subscribe-catalog "uniffi_moq_ffi_checksum_method_moqbroadcastconsumer_subscribe_catalog" [] :uint16) | |
| 106 | +(ffi/defcfn checksum-method-moqbroadcastconsumer-subscribe-json-snapshot "uniffi_moq_ffi_checksum_method_moqbroadcastconsumer_subscribe_json_snapshot" [] :uint16) | |
| 107 | +(ffi/defcfn checksum-method-moqbroadcastconsumer-subscribe-json-stream "uniffi_moq_ffi_checksum_method_moqbroadcastconsumer_subscribe_json_stream" [] :uint16) | |
| 108 | +(ffi/defcfn checksum-method-moqbroadcastconsumer-subscribe-media "uniffi_moq_ffi_checksum_method_moqbroadcastconsumer_subscribe_media" [] :uint16) | |
| 109 | +(ffi/defcfn checksum-method-moqbroadcastconsumer-subscribe-track "uniffi_moq_ffi_checksum_method_moqbroadcastconsumer_subscribe_track" [] :uint16) | |
| 110 | +(ffi/defcfn checksum-method-moqbroadcastdynamic-cancel "uniffi_moq_ffi_checksum_method_moqbroadcastdynamic_cancel" [] :uint16) | |
| 111 | +(ffi/defcfn checksum-method-moqbroadcastdynamic-requested-track "uniffi_moq_ffi_checksum_method_moqbroadcastdynamic_requested_track" [] :uint16) | |
| 112 | +(ffi/defcfn checksum-method-moqbroadcastproducer-consume "uniffi_moq_ffi_checksum_method_moqbroadcastproducer_consume" [] :uint16) | |
| 113 | +(ffi/defcfn checksum-method-moqbroadcastproducer-dynamic "uniffi_moq_ffi_checksum_method_moqbroadcastproducer_dynamic" [] :uint16) | |
| 114 | +(ffi/defcfn checksum-method-moqbroadcastproducer-finish "uniffi_moq_ffi_checksum_method_moqbroadcastproducer_finish" [] :uint16) | |
| 115 | +(ffi/defcfn checksum-method-moqbroadcastproducer-publish-json-snapshot "uniffi_moq_ffi_checksum_method_moqbroadcastproducer_publish_json_snapshot" [] :uint16) | |
| 116 | +(ffi/defcfn checksum-method-moqbroadcastproducer-publish-json-stream "uniffi_moq_ffi_checksum_method_moqbroadcastproducer_publish_json_stream" [] :uint16) | |
| 117 | +(ffi/defcfn checksum-method-moqbroadcastproducer-publish-media "uniffi_moq_ffi_checksum_method_moqbroadcastproducer_publish_media" [] :uint16) | |
| 118 | +(ffi/defcfn checksum-method-moqbroadcastproducer-publish-media-on-track "uniffi_moq_ffi_checksum_method_moqbroadcastproducer_publish_media_on_track" [] :uint16) | |
| 119 | +(ffi/defcfn checksum-method-moqbroadcastproducer-publish-media-stream "uniffi_moq_ffi_checksum_method_moqbroadcastproducer_publish_media_stream" [] :uint16) | |
| 120 | +(ffi/defcfn checksum-method-moqbroadcastproducer-publish-track "uniffi_moq_ffi_checksum_method_moqbroadcastproducer_publish_track" [] :uint16) | |
| 121 | +(ffi/defcfn checksum-method-moqbroadcastproducer-remove-catalog-section "uniffi_moq_ffi_checksum_method_moqbroadcastproducer_remove_catalog_section" [] :uint16) | |
| 122 | +(ffi/defcfn checksum-method-moqbroadcastproducer-set-announce "uniffi_moq_ffi_checksum_method_moqbroadcastproducer_set_announce" [] :uint16) | |
| 123 | +(ffi/defcfn checksum-method-moqbroadcastproducer-set-catalog-section "uniffi_moq_ffi_checksum_method_moqbroadcastproducer_set_catalog_section" [] :uint16) | |
| 124 | +(ffi/defcfn checksum-method-moqbroadcastproducer-set-route "uniffi_moq_ffi_checksum_method_moqbroadcastproducer_set_route" [] :uint16) | |
| 125 | +(ffi/defcfn checksum-method-moqbroadcastproducer-set-video-properties "uniffi_moq_ffi_checksum_method_moqbroadcastproducer_set_video_properties" [] :uint16) | |
| 126 | +(ffi/defcfn checksum-method-moqbroadcastrequest-abort "uniffi_moq_ffi_checksum_method_moqbroadcastrequest_abort" [] :uint16) | |
| 127 | +(ffi/defcfn checksum-method-moqbroadcastrequest-accept "uniffi_moq_ffi_checksum_method_moqbroadcastrequest_accept" [] :uint16) | |
| 128 | +(ffi/defcfn checksum-method-moqbroadcastrequest-path "uniffi_moq_ffi_checksum_method_moqbroadcastrequest_path" [] :uint16) | |
| 129 | +(ffi/defcfn checksum-method-moqcatalogconsumer-cancel "uniffi_moq_ffi_checksum_method_moqcatalogconsumer_cancel" [] :uint16) | |
| 130 | +(ffi/defcfn checksum-method-moqcatalogconsumer-next "uniffi_moq_ffi_checksum_method_moqcatalogconsumer_next" [] :uint16) | |
| 131 | +(ffi/defcfn checksum-method-moqclient-cancel "uniffi_moq_ffi_checksum_method_moqclient_cancel" [] :uint16) | |
| 132 | +(ffi/defcfn checksum-method-moqclient-connect "uniffi_moq_ffi_checksum_method_moqclient_connect" [] :uint16) | |
| 133 | +(ffi/defcfn checksum-method-moqclient-set-bind "uniffi_moq_ffi_checksum_method_moqclient_set_bind" [] :uint16) | |
| 134 | +(ffi/defcfn checksum-method-moqclient-set-consume "uniffi_moq_ffi_checksum_method_moqclient_set_consume" [] :uint16) | |
| 135 | +(ffi/defcfn checksum-method-moqclient-set-publish "uniffi_moq_ffi_checksum_method_moqclient_set_publish" [] :uint16) | |
| 136 | +(ffi/defcfn checksum-method-moqclient-set-tls-cert "uniffi_moq_ffi_checksum_method_moqclient_set_tls_cert" [] :uint16) | |
| 137 | +(ffi/defcfn checksum-method-moqclient-set-tls-disable-verify "uniffi_moq_ffi_checksum_method_moqclient_set_tls_disable_verify" [] :uint16) | |
| 138 | +(ffi/defcfn checksum-method-moqclient-set-tls-fingerprints "uniffi_moq_ffi_checksum_method_moqclient_set_tls_fingerprints" [] :uint16) | |
| 139 | +(ffi/defcfn checksum-method-moqclient-set-tls-key "uniffi_moq_ffi_checksum_method_moqclient_set_tls_key" [] :uint16) | |
| 140 | +(ffi/defcfn checksum-method-moqclient-set-tls-roots "uniffi_moq_ffi_checksum_method_moqclient_set_tls_roots" [] :uint16) | |
| 141 | +(ffi/defcfn checksum-method-moqclient-set-tls-system-roots "uniffi_moq_ffi_checksum_method_moqclient_set_tls_system_roots" [] :uint16) | |
| 142 | +(ffi/defcfn checksum-method-moqgroupconsumer-cancel "uniffi_moq_ffi_checksum_method_moqgroupconsumer_cancel" [] :uint16) | |
| 143 | +(ffi/defcfn checksum-method-moqgroupconsumer-read-frame "uniffi_moq_ffi_checksum_method_moqgroupconsumer_read_frame" [] :uint16) | |
| 144 | +(ffi/defcfn checksum-method-moqgroupconsumer-sequence "uniffi_moq_ffi_checksum_method_moqgroupconsumer_sequence" [] :uint16) | |
| 145 | +(ffi/defcfn checksum-method-moqgroupproducer-abort "uniffi_moq_ffi_checksum_method_moqgroupproducer_abort" [] :uint16) | |
| 146 | +(ffi/defcfn checksum-method-moqgroupproducer-consume "uniffi_moq_ffi_checksum_method_moqgroupproducer_consume" [] :uint16) | |
| 147 | +(ffi/defcfn checksum-method-moqgroupproducer-finish "uniffi_moq_ffi_checksum_method_moqgroupproducer_finish" [] :uint16) | |
| 148 | +(ffi/defcfn checksum-method-moqgroupproducer-sequence "uniffi_moq_ffi_checksum_method_moqgroupproducer_sequence" [] :uint16) | |
| 149 | +(ffi/defcfn checksum-method-moqgroupproducer-write-frame "uniffi_moq_ffi_checksum_method_moqgroupproducer_write_frame" [] :uint16) | |
| 150 | +(ffi/defcfn checksum-method-moqgrouprequest-abort "uniffi_moq_ffi_checksum_method_moqgrouprequest_abort" [] :uint16) | |
| 151 | +(ffi/defcfn checksum-method-moqgrouprequest-accept "uniffi_moq_ffi_checksum_method_moqgrouprequest_accept" [] :uint16) | |
| 152 | +(ffi/defcfn checksum-method-moqgrouprequest-priority "uniffi_moq_ffi_checksum_method_moqgrouprequest_priority" [] :uint16) | |
| 153 | +(ffi/defcfn checksum-method-moqgrouprequest-sequence "uniffi_moq_ffi_checksum_method_moqgrouprequest_sequence" [] :uint16) | |
| 154 | +(ffi/defcfn checksum-method-moqjsonsnapshotconsumer-cancel "uniffi_moq_ffi_checksum_method_moqjsonsnapshotconsumer_cancel" [] :uint16) | |
| 155 | +(ffi/defcfn checksum-method-moqjsonsnapshotconsumer-next "uniffi_moq_ffi_checksum_method_moqjsonsnapshotconsumer_next" [] :uint16) | |
| 156 | +(ffi/defcfn checksum-method-moqjsonsnapshotproducer-finish "uniffi_moq_ffi_checksum_method_moqjsonsnapshotproducer_finish" [] :uint16) | |
| 157 | +(ffi/defcfn checksum-method-moqjsonsnapshotproducer-update "uniffi_moq_ffi_checksum_method_moqjsonsnapshotproducer_update" [] :uint16) | |
| 158 | +(ffi/defcfn checksum-method-moqjsonstreamconsumer-cancel "uniffi_moq_ffi_checksum_method_moqjsonstreamconsumer_cancel" [] :uint16) | |
| 159 | +(ffi/defcfn checksum-method-moqjsonstreamconsumer-next "uniffi_moq_ffi_checksum_method_moqjsonstreamconsumer_next" [] :uint16) | |
| 160 | +(ffi/defcfn checksum-method-moqjsonstreamproducer-append "uniffi_moq_ffi_checksum_method_moqjsonstreamproducer_append" [] :uint16) | |
| 161 | +(ffi/defcfn checksum-method-moqjsonstreamproducer-finish "uniffi_moq_ffi_checksum_method_moqjsonstreamproducer_finish" [] :uint16) | |
| 162 | +(ffi/defcfn checksum-method-moqmediaconsumer-cancel "uniffi_moq_ffi_checksum_method_moqmediaconsumer_cancel" [] :uint16) | |
| 163 | +(ffi/defcfn checksum-method-moqmediaconsumer-next "uniffi_moq_ffi_checksum_method_moqmediaconsumer_next" [] :uint16) | |
| 164 | +(ffi/defcfn checksum-method-moqmediagroupconsumer-cancel "uniffi_moq_ffi_checksum_method_moqmediagroupconsumer_cancel" [] :uint16) | |
| 165 | +(ffi/defcfn checksum-method-moqmediagroupconsumer-next "uniffi_moq_ffi_checksum_method_moqmediagroupconsumer_next" [] :uint16) | |
| 166 | +(ffi/defcfn checksum-method-moqmediagroupconsumer-sequence "uniffi_moq_ffi_checksum_method_moqmediagroupconsumer_sequence" [] :uint16) | |
| 167 | +(ffi/defcfn checksum-method-moqmediaproducer-finish "uniffi_moq_ffi_checksum_method_moqmediaproducer_finish" [] :uint16) | |
| 168 | +(ffi/defcfn checksum-method-moqmediaproducer-name "uniffi_moq_ffi_checksum_method_moqmediaproducer_name" [] :uint16) | |
| 169 | +(ffi/defcfn checksum-method-moqmediaproducer-unused "uniffi_moq_ffi_checksum_method_moqmediaproducer_unused" [] :uint16) | |
| 170 | +(ffi/defcfn checksum-method-moqmediaproducer-used "uniffi_moq_ffi_checksum_method_moqmediaproducer_used" [] :uint16) | |
| 171 | +(ffi/defcfn checksum-method-moqmediaproducer-write-frame "uniffi_moq_ffi_checksum_method_moqmediaproducer_write_frame" [] :uint16) | |
| 172 | +(ffi/defcfn checksum-method-moqmediastreamproducer-finish "uniffi_moq_ffi_checksum_method_moqmediastreamproducer_finish" [] :uint16) | |
| 173 | +(ffi/defcfn checksum-method-moqmediastreamproducer-write "uniffi_moq_ffi_checksum_method_moqmediastreamproducer_write" [] :uint16) | |
| 174 | +(ffi/defcfn checksum-method-moqoriginconsumer-announced "uniffi_moq_ffi_checksum_method_moqoriginconsumer_announced" [] :uint16) | |
| 175 | +(ffi/defcfn checksum-method-moqoriginconsumer-announced-broadcast "uniffi_moq_ffi_checksum_method_moqoriginconsumer_announced_broadcast" [] :uint16) | |
| 176 | +(ffi/defcfn checksum-method-moqoriginconsumer-request-broadcast "uniffi_moq_ffi_checksum_method_moqoriginconsumer_request_broadcast" [] :uint16) | |
| 177 | +(ffi/defcfn checksum-method-moqorigindynamic-cancel "uniffi_moq_ffi_checksum_method_moqorigindynamic_cancel" [] :uint16) | |
| 178 | +(ffi/defcfn checksum-method-moqorigindynamic-requested-broadcast "uniffi_moq_ffi_checksum_method_moqorigindynamic_requested_broadcast" [] :uint16) | |
| 179 | +(ffi/defcfn checksum-method-moqoriginproducer-consume "uniffi_moq_ffi_checksum_method_moqoriginproducer_consume" [] :uint16) | |
| 180 | +(ffi/defcfn checksum-method-moqoriginproducer-create-broadcast "uniffi_moq_ffi_checksum_method_moqoriginproducer_create_broadcast" [] :uint16) | |
| 181 | +(ffi/defcfn checksum-method-moqoriginproducer-dynamic "uniffi_moq_ffi_checksum_method_moqoriginproducer_dynamic" [] :uint16) | |
| 182 | +(ffi/defcfn checksum-method-moqrequest-accept "uniffi_moq_ffi_checksum_method_moqrequest_accept" [] :uint16) | |
| 183 | +(ffi/defcfn checksum-method-moqrequest-cancel "uniffi_moq_ffi_checksum_method_moqrequest_cancel" [] :uint16) | |
| 184 | +(ffi/defcfn checksum-method-moqrequest-path "uniffi_moq_ffi_checksum_method_moqrequest_path" [] :uint16) | |
| 185 | +(ffi/defcfn checksum-method-moqrequest-query "uniffi_moq_ffi_checksum_method_moqrequest_query" [] :uint16) | |
| 186 | +(ffi/defcfn checksum-method-moqrequest-reject "uniffi_moq_ffi_checksum_method_moqrequest_reject" [] :uint16) | |
| 187 | +(ffi/defcfn checksum-method-moqrequest-set-consume "uniffi_moq_ffi_checksum_method_moqrequest_set_consume" [] :uint16) | |
| 188 | +(ffi/defcfn checksum-method-moqrequest-set-publish "uniffi_moq_ffi_checksum_method_moqrequest_set_publish" [] :uint16) | |
| 189 | +(ffi/defcfn checksum-method-moqrequest-transport "uniffi_moq_ffi_checksum_method_moqrequest_transport" [] :uint16) | |
| 190 | +(ffi/defcfn checksum-method-moqrequest-url "uniffi_moq_ffi_checksum_method_moqrequest_url" [] :uint16) | |
| 191 | +(ffi/defcfn checksum-method-moqroutewatch-cancel "uniffi_moq_ffi_checksum_method_moqroutewatch_cancel" [] :uint16) | |
| 192 | +(ffi/defcfn checksum-method-moqroutewatch-next "uniffi_moq_ffi_checksum_method_moqroutewatch_next" [] :uint16) | |
| 193 | +(ffi/defcfn checksum-method-moqserver-accept "uniffi_moq_ffi_checksum_method_moqserver_accept" [] :uint16) | |
| 194 | +(ffi/defcfn checksum-method-moqserver-cancel "uniffi_moq_ffi_checksum_method_moqserver_cancel" [] :uint16) | |
| 195 | +(ffi/defcfn checksum-method-moqserver-cert-fingerprints "uniffi_moq_ffi_checksum_method_moqserver_cert_fingerprints" [] :uint16) | |
| 196 | +(ffi/defcfn checksum-method-moqserver-listen "uniffi_moq_ffi_checksum_method_moqserver_listen" [] :uint16) | |
| 197 | +(ffi/defcfn checksum-method-moqserver-set-bind "uniffi_moq_ffi_checksum_method_moqserver_set_bind" [] :uint16) | |
| 198 | +(ffi/defcfn checksum-method-moqserver-set-consume "uniffi_moq_ffi_checksum_method_moqserver_set_consume" [] :uint16) | |
| 199 | +(ffi/defcfn checksum-method-moqserver-set-publish "uniffi_moq_ffi_checksum_method_moqserver_set_publish" [] :uint16) | |
| 200 | +(ffi/defcfn checksum-method-moqserver-set-tls-cert "uniffi_moq_ffi_checksum_method_moqserver_set_tls_cert" [] :uint16) | |
| 201 | +(ffi/defcfn checksum-method-moqserver-set-tls-generate "uniffi_moq_ffi_checksum_method_moqserver_set_tls_generate" [] :uint16) | |
| 202 | +(ffi/defcfn checksum-method-moqserver-set-tls-key "uniffi_moq_ffi_checksum_method_moqserver_set_tls_key" [] :uint16) | |
| 203 | +(ffi/defcfn checksum-method-moqsession-cancel "uniffi_moq_ffi_checksum_method_moqsession_cancel" [] :uint16) | |
| 204 | +(ffi/defcfn checksum-method-moqsession-closed "uniffi_moq_ffi_checksum_method_moqsession_closed" [] :uint16) | |
| 205 | +(ffi/defcfn checksum-method-moqsession-consumer "uniffi_moq_ffi_checksum_method_moqsession_consumer" [] :uint16) | |
| 206 | +(ffi/defcfn checksum-method-moqsession-publisher "uniffi_moq_ffi_checksum_method_moqsession_publisher" [] :uint16) | |
| 207 | +(ffi/defcfn checksum-method-moqsession-shutdown "uniffi_moq_ffi_checksum_method_moqsession_shutdown" [] :uint16) | |
| 208 | +(ffi/defcfn checksum-method-moqsession-stats "uniffi_moq_ffi_checksum_method_moqsession_stats" [] :uint16) | |
| 209 | +(ffi/defcfn checksum-method-moqtrackconsumer-cancel "uniffi_moq_ffi_checksum_method_moqtrackconsumer_cancel" [] :uint16) | |
| 210 | +(ffi/defcfn checksum-method-moqtrackconsumer-info "uniffi_moq_ffi_checksum_method_moqtrackconsumer_info" [] :uint16) | |
| 211 | +(ffi/defcfn checksum-method-moqtrackconsumer-next-group "uniffi_moq_ffi_checksum_method_moqtrackconsumer_next_group" [] :uint16) | |
| 212 | +(ffi/defcfn checksum-method-moqtrackconsumer-read-frame "uniffi_moq_ffi_checksum_method_moqtrackconsumer_read_frame" [] :uint16) | |
| 213 | +(ffi/defcfn checksum-method-moqtrackconsumer-recv-datagram "uniffi_moq_ffi_checksum_method_moqtrackconsumer_recv_datagram" [] :uint16) | |
| 214 | +(ffi/defcfn checksum-method-moqtrackconsumer-recv-group "uniffi_moq_ffi_checksum_method_moqtrackconsumer_recv_group" [] :uint16) | |
| 215 | +(ffi/defcfn checksum-method-moqtrackconsumer-update "uniffi_moq_ffi_checksum_method_moqtrackconsumer_update" [] :uint16) | |
| 216 | +(ffi/defcfn checksum-method-moqtrackdynamic-cancel "uniffi_moq_ffi_checksum_method_moqtrackdynamic_cancel" [] :uint16) | |
| 217 | +(ffi/defcfn checksum-method-moqtrackdynamic-requested-group "uniffi_moq_ffi_checksum_method_moqtrackdynamic_requested_group" [] :uint16) | |
| 218 | +(ffi/defcfn checksum-method-moqtrackproducer-abort "uniffi_moq_ffi_checksum_method_moqtrackproducer_abort" [] :uint16) | |
| 219 | +(ffi/defcfn checksum-method-moqtrackproducer-append-datagram "uniffi_moq_ffi_checksum_method_moqtrackproducer_append_datagram" [] :uint16) | |
| 220 | +(ffi/defcfn checksum-method-moqtrackproducer-append-group "uniffi_moq_ffi_checksum_method_moqtrackproducer_append_group" [] :uint16) | |
| 221 | +(ffi/defcfn checksum-method-moqtrackproducer-consume "uniffi_moq_ffi_checksum_method_moqtrackproducer_consume" [] :uint16) | |
| 222 | +(ffi/defcfn checksum-method-moqtrackproducer-create-group "uniffi_moq_ffi_checksum_method_moqtrackproducer_create_group" [] :uint16) | |
| 223 | +(ffi/defcfn checksum-method-moqtrackproducer-dynamic "uniffi_moq_ffi_checksum_method_moqtrackproducer_dynamic" [] :uint16) | |
| 224 | +(ffi/defcfn checksum-method-moqtrackproducer-finish "uniffi_moq_ffi_checksum_method_moqtrackproducer_finish" [] :uint16) | |
| 225 | +(ffi/defcfn checksum-method-moqtrackproducer-finish-at "uniffi_moq_ffi_checksum_method_moqtrackproducer_finish_at" [] :uint16) | |
| 226 | +(ffi/defcfn checksum-method-moqtrackproducer-name "uniffi_moq_ffi_checksum_method_moqtrackproducer_name" [] :uint16) | |
| 227 | +(ffi/defcfn checksum-method-moqtrackproducer-unused "uniffi_moq_ffi_checksum_method_moqtrackproducer_unused" [] :uint16) | |
| 228 | +(ffi/defcfn checksum-method-moqtrackproducer-used "uniffi_moq_ffi_checksum_method_moqtrackproducer_used" [] :uint16) | |
| 229 | +(ffi/defcfn checksum-method-moqtrackproducer-write-frame "uniffi_moq_ffi_checksum_method_moqtrackproducer_write_frame" [] :uint16) | |
| 230 | +(ffi/defcfn checksum-method-moqtrackrequest-abort "uniffi_moq_ffi_checksum_method_moqtrackrequest_abort" [] :uint16) | |
| 231 | +(ffi/defcfn checksum-method-moqtrackrequest-accept "uniffi_moq_ffi_checksum_method_moqtrackrequest_accept" [] :uint16) | |
| 232 | +(ffi/defcfn checksum-method-moqtrackrequest-dynamic "uniffi_moq_ffi_checksum_method_moqtrackrequest_dynamic" [] :uint16) | |
| 233 | +(ffi/defcfn checksum-method-moqtrackrequest-name "uniffi_moq_ffi_checksum_method_moqtrackrequest_name" [] :uint16) | |
| 234 | +(ffi/defcfn clone-moqannounced "uniffi_moq_ffi_fn_clone_moqannounced" [:uint64 :pointer] :uint64) | |
| 235 | +(ffi/defcfn clone-moqannouncedbroadcast "uniffi_moq_ffi_fn_clone_moqannouncedbroadcast" [:uint64 :pointer] :uint64) | |
| 236 | +(ffi/defcfn clone-moqannouncement "uniffi_moq_ffi_fn_clone_moqannouncement" [:uint64 :pointer] :uint64) | |
| 237 | +(ffi/defcfn clone-moqbroadcastconsumer "uniffi_moq_ffi_fn_clone_moqbroadcastconsumer" [:uint64 :pointer] :uint64) | |
| 238 | +(ffi/defcfn clone-moqbroadcastdynamic "uniffi_moq_ffi_fn_clone_moqbroadcastdynamic" [:uint64 :pointer] :uint64) | |
| 239 | +(ffi/defcfn clone-moqbroadcastproducer "uniffi_moq_ffi_fn_clone_moqbroadcastproducer" [:uint64 :pointer] :uint64) | |
| 240 | +(ffi/defcfn clone-moqbroadcastrequest "uniffi_moq_ffi_fn_clone_moqbroadcastrequest" [:uint64 :pointer] :uint64) | |
| 241 | +(ffi/defcfn clone-moqcatalogconsumer "uniffi_moq_ffi_fn_clone_moqcatalogconsumer" [:uint64 :pointer] :uint64) | |
| 242 | +(ffi/defcfn clone-moqclient "uniffi_moq_ffi_fn_clone_moqclient" [:uint64 :pointer] :uint64) | |
| 243 | +(ffi/defcfn clone-moqgroupconsumer "uniffi_moq_ffi_fn_clone_moqgroupconsumer" [:uint64 :pointer] :uint64) | |
| 244 | +(ffi/defcfn clone-moqgroupproducer "uniffi_moq_ffi_fn_clone_moqgroupproducer" [:uint64 :pointer] :uint64) | |
| 245 | +(ffi/defcfn clone-moqgrouprequest "uniffi_moq_ffi_fn_clone_moqgrouprequest" [:uint64 :pointer] :uint64) | |
| 246 | +(ffi/defcfn clone-moqjsonsnapshotconsumer "uniffi_moq_ffi_fn_clone_moqjsonsnapshotconsumer" [:uint64 :pointer] :uint64) | |
| 247 | +(ffi/defcfn clone-moqjsonsnapshotproducer "uniffi_moq_ffi_fn_clone_moqjsonsnapshotproducer" [:uint64 :pointer] :uint64) | |
| 248 | +(ffi/defcfn clone-moqjsonstreamconsumer "uniffi_moq_ffi_fn_clone_moqjsonstreamconsumer" [:uint64 :pointer] :uint64) | |
| 249 | +(ffi/defcfn clone-moqjsonstreamproducer "uniffi_moq_ffi_fn_clone_moqjsonstreamproducer" [:uint64 :pointer] :uint64) | |
| 250 | +(ffi/defcfn clone-moqmediaconsumer "uniffi_moq_ffi_fn_clone_moqmediaconsumer" [:uint64 :pointer] :uint64) | |
| 251 | +(ffi/defcfn clone-moqmediagroupconsumer "uniffi_moq_ffi_fn_clone_moqmediagroupconsumer" [:uint64 :pointer] :uint64) | |
| 252 | +(ffi/defcfn clone-moqmediaproducer "uniffi_moq_ffi_fn_clone_moqmediaproducer" [:uint64 :pointer] :uint64) | |
| 253 | +(ffi/defcfn clone-moqmediastreamproducer "uniffi_moq_ffi_fn_clone_moqmediastreamproducer" [:uint64 :pointer] :uint64) | |
| 254 | +(ffi/defcfn clone-moqoriginconsumer "uniffi_moq_ffi_fn_clone_moqoriginconsumer" [:uint64 :pointer] :uint64) | |
| 255 | +(ffi/defcfn clone-moqorigindynamic "uniffi_moq_ffi_fn_clone_moqorigindynamic" [:uint64 :pointer] :uint64) | |
| 256 | +(ffi/defcfn clone-moqoriginproducer "uniffi_moq_ffi_fn_clone_moqoriginproducer" [:uint64 :pointer] :uint64) | |
| 257 | +(ffi/defcfn clone-moqrequest "uniffi_moq_ffi_fn_clone_moqrequest" [:uint64 :pointer] :uint64) | |
| 258 | +(ffi/defcfn clone-moqroutewatch "uniffi_moq_ffi_fn_clone_moqroutewatch" [:uint64 :pointer] :uint64) | |
| 259 | +(ffi/defcfn clone-moqserver "uniffi_moq_ffi_fn_clone_moqserver" [:uint64 :pointer] :uint64) | |
| 260 | +(ffi/defcfn clone-moqsession "uniffi_moq_ffi_fn_clone_moqsession" [:uint64 :pointer] :uint64) | |
| 261 | +(ffi/defcfn clone-moqtrackconsumer "uniffi_moq_ffi_fn_clone_moqtrackconsumer" [:uint64 :pointer] :uint64) | |
| 262 | +(ffi/defcfn clone-moqtrackdynamic "uniffi_moq_ffi_fn_clone_moqtrackdynamic" [:uint64 :pointer] :uint64) | |
| 263 | +(ffi/defcfn clone-moqtrackproducer "uniffi_moq_ffi_fn_clone_moqtrackproducer" [:uint64 :pointer] :uint64) | |
| 264 | +(ffi/defcfn clone-moqtrackrequest "uniffi_moq_ffi_fn_clone_moqtrackrequest" [:uint64 :pointer] :uint64) | |
| 265 | +(ffi/defcfn constructor-moqbroadcastproducer-new "uniffi_moq_ffi_fn_constructor_moqbroadcastproducer_new" [:pointer] :uint64) | |
| 266 | +(ffi/defcfn constructor-moqclient-new "uniffi_moq_ffi_fn_constructor_moqclient_new" [:pointer] :uint64) | |
| 267 | +(ffi/defcfn constructor-moqoriginproducer-new "uniffi_moq_ffi_fn_constructor_moqoriginproducer_new" [[:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :uint64) | |
| 268 | +(ffi/defcfn constructor-moqserver-new "uniffi_moq_ffi_fn_constructor_moqserver_new" [:pointer] :uint64) | |
| 269 | +(ffi/defcfn free-moqannounced "uniffi_moq_ffi_fn_free_moqannounced" [:uint64 :pointer] :void) | |
| 270 | +(ffi/defcfn free-moqannouncedbroadcast "uniffi_moq_ffi_fn_free_moqannouncedbroadcast" [:uint64 :pointer] :void) | |
| 271 | +(ffi/defcfn free-moqannouncement "uniffi_moq_ffi_fn_free_moqannouncement" [:uint64 :pointer] :void) | |
| 272 | +(ffi/defcfn free-moqbroadcastconsumer "uniffi_moq_ffi_fn_free_moqbroadcastconsumer" [:uint64 :pointer] :void) | |
| 273 | +(ffi/defcfn free-moqbroadcastdynamic "uniffi_moq_ffi_fn_free_moqbroadcastdynamic" [:uint64 :pointer] :void) | |
| 274 | +(ffi/defcfn free-moqbroadcastproducer "uniffi_moq_ffi_fn_free_moqbroadcastproducer" [:uint64 :pointer] :void) | |
| 275 | +(ffi/defcfn free-moqbroadcastrequest "uniffi_moq_ffi_fn_free_moqbroadcastrequest" [:uint64 :pointer] :void) | |
| 276 | +(ffi/defcfn free-moqcatalogconsumer "uniffi_moq_ffi_fn_free_moqcatalogconsumer" [:uint64 :pointer] :void) | |
| 277 | +(ffi/defcfn free-moqclient "uniffi_moq_ffi_fn_free_moqclient" [:uint64 :pointer] :void) | |
| 278 | +(ffi/defcfn free-moqgroupconsumer "uniffi_moq_ffi_fn_free_moqgroupconsumer" [:uint64 :pointer] :void) | |
| 279 | +(ffi/defcfn free-moqgroupproducer "uniffi_moq_ffi_fn_free_moqgroupproducer" [:uint64 :pointer] :void) | |
| 280 | +(ffi/defcfn free-moqgrouprequest "uniffi_moq_ffi_fn_free_moqgrouprequest" [:uint64 :pointer] :void) | |
| 281 | +(ffi/defcfn free-moqjsonsnapshotconsumer "uniffi_moq_ffi_fn_free_moqjsonsnapshotconsumer" [:uint64 :pointer] :void) | |
| 282 | +(ffi/defcfn free-moqjsonsnapshotproducer "uniffi_moq_ffi_fn_free_moqjsonsnapshotproducer" [:uint64 :pointer] :void) | |
| 283 | +(ffi/defcfn free-moqjsonstreamconsumer "uniffi_moq_ffi_fn_free_moqjsonstreamconsumer" [:uint64 :pointer] :void) | |
| 284 | +(ffi/defcfn free-moqjsonstreamproducer "uniffi_moq_ffi_fn_free_moqjsonstreamproducer" [:uint64 :pointer] :void) | |
| 285 | +(ffi/defcfn free-moqmediaconsumer "uniffi_moq_ffi_fn_free_moqmediaconsumer" [:uint64 :pointer] :void) | |
| 286 | +(ffi/defcfn free-moqmediagroupconsumer "uniffi_moq_ffi_fn_free_moqmediagroupconsumer" [:uint64 :pointer] :void) | |
| 287 | +(ffi/defcfn free-moqmediaproducer "uniffi_moq_ffi_fn_free_moqmediaproducer" [:uint64 :pointer] :void) | |
| 288 | +(ffi/defcfn free-moqmediastreamproducer "uniffi_moq_ffi_fn_free_moqmediastreamproducer" [:uint64 :pointer] :void) | |
| 289 | +(ffi/defcfn free-moqoriginconsumer "uniffi_moq_ffi_fn_free_moqoriginconsumer" [:uint64 :pointer] :void) | |
| 290 | +(ffi/defcfn free-moqorigindynamic "uniffi_moq_ffi_fn_free_moqorigindynamic" [:uint64 :pointer] :void) | |
| 291 | +(ffi/defcfn free-moqoriginproducer "uniffi_moq_ffi_fn_free_moqoriginproducer" [:uint64 :pointer] :void) | |
| 292 | +(ffi/defcfn free-moqrequest "uniffi_moq_ffi_fn_free_moqrequest" [:uint64 :pointer] :void) | |
| 293 | +(ffi/defcfn free-moqroutewatch "uniffi_moq_ffi_fn_free_moqroutewatch" [:uint64 :pointer] :void) | |
| 294 | +(ffi/defcfn free-moqserver "uniffi_moq_ffi_fn_free_moqserver" [:uint64 :pointer] :void) | |
| 295 | +(ffi/defcfn free-moqsession "uniffi_moq_ffi_fn_free_moqsession" [:uint64 :pointer] :void) | |
| 296 | +(ffi/defcfn free-moqtrackconsumer "uniffi_moq_ffi_fn_free_moqtrackconsumer" [:uint64 :pointer] :void) | |
| 297 | +(ffi/defcfn free-moqtrackdynamic "uniffi_moq_ffi_fn_free_moqtrackdynamic" [:uint64 :pointer] :void) | |
| 298 | +(ffi/defcfn free-moqtrackproducer "uniffi_moq_ffi_fn_free_moqtrackproducer" [:uint64 :pointer] :void) | |
| 299 | +(ffi/defcfn free-moqtrackrequest "uniffi_moq_ffi_fn_free_moqtrackrequest" [:uint64 :pointer] :void) | |
| 300 | +(ffi/defcfn func-moq-log-level "uniffi_moq_ffi_fn_func_moq_log_level" [[:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | |
| 301 | +(ffi/defcfn method-moqannounced-cancel "uniffi_moq_ffi_fn_method_moqannounced_cancel" [:uint64 :pointer] :void) | |
| 302 | +(ffi/defcfn method-moqannounced-next "uniffi_moq_ffi_fn_method_moqannounced_next" [:uint64] :uint64) | |
| 303 | +(ffi/defcfn method-moqannouncedbroadcast-available "uniffi_moq_ffi_fn_method_moqannouncedbroadcast_available" [:uint64] :uint64) | |
| 304 | +(ffi/defcfn method-moqannouncedbroadcast-cancel "uniffi_moq_ffi_fn_method_moqannouncedbroadcast_cancel" [:uint64 :pointer] :void) | |
| 305 | +(ffi/defcfn method-moqannouncement-broadcast "uniffi_moq_ffi_fn_method_moqannouncement_broadcast" [:uint64 :pointer] :uint64) | |
| 306 | +(ffi/defcfn method-moqannouncement-path "uniffi_moq_ffi_fn_method_moqannouncement_path" [:uint64 :pointer] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]) | |
| 307 | +(ffi/defcfn method-moqbroadcastconsumer-fetch-group "uniffi_moq_ffi_fn_method_moqbroadcastconsumer_fetch_group" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]] :uint64) | |
| 308 | +(ffi/defcfn method-moqbroadcastconsumer-fetch-media-group "uniffi_moq_ffi_fn_method_moqbroadcastconsumer_fetch_media_group" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]] :uint64) | |
| 309 | +(ffi/defcfn method-moqbroadcastconsumer-route "uniffi_moq_ffi_fn_method_moqbroadcastconsumer_route" [:uint64 :pointer] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]) | |
| 310 | +(ffi/defcfn method-moqbroadcastconsumer-route-updates "uniffi_moq_ffi_fn_method_moqbroadcastconsumer_route_updates" [:uint64 :pointer] :uint64) | |
| 311 | +(ffi/defcfn method-moqbroadcastconsumer-subscribe-catalog "uniffi_moq_ffi_fn_method_moqbroadcastconsumer_subscribe_catalog" [:uint64] :uint64) | |
| 312 | +(ffi/defcfn method-moqbroadcastconsumer-subscribe-json-snapshot "uniffi_moq_ffi_fn_method_moqbroadcastconsumer_subscribe_json_snapshot" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]] :uint64) | |
| 313 | +(ffi/defcfn method-moqbroadcastconsumer-subscribe-json-stream "uniffi_moq_ffi_fn_method_moqbroadcastconsumer_subscribe_json_stream" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]] :uint64) | |
| 314 | +(ffi/defcfn method-moqbroadcastconsumer-subscribe-media "uniffi_moq_ffi_fn_method_moqbroadcastconsumer_subscribe_media" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]] :uint64) | |
| 315 | +(ffi/defcfn method-moqbroadcastconsumer-subscribe-track "uniffi_moq_ffi_fn_method_moqbroadcastconsumer_subscribe_track" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]] :uint64) | |
| 316 | +(ffi/defcfn method-moqbroadcastdynamic-cancel "uniffi_moq_ffi_fn_method_moqbroadcastdynamic_cancel" [:uint64 :pointer] :void) | |
| 317 | +(ffi/defcfn method-moqbroadcastdynamic-requested-track "uniffi_moq_ffi_fn_method_moqbroadcastdynamic_requested_track" [:uint64] :uint64) | |
| 318 | +(ffi/defcfn method-moqbroadcastproducer-consume "uniffi_moq_ffi_fn_method_moqbroadcastproducer_consume" [:uint64 :pointer] :uint64) | |
| 319 | +(ffi/defcfn method-moqbroadcastproducer-dynamic "uniffi_moq_ffi_fn_method_moqbroadcastproducer_dynamic" [:uint64 :pointer] :uint64) | |
| 320 | +(ffi/defcfn method-moqbroadcastproducer-finish "uniffi_moq_ffi_fn_method_moqbroadcastproducer_finish" [:uint64 :pointer] :void) | |
| 321 | +(ffi/defcfn method-moqbroadcastproducer-publish-json-snapshot "uniffi_moq_ffi_fn_method_moqbroadcastproducer_publish_json_snapshot" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :uint64) | |
| 322 | +(ffi/defcfn method-moqbroadcastproducer-publish-json-stream "uniffi_moq_ffi_fn_method_moqbroadcastproducer_publish_json_stream" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :uint64) | |
| 323 | +(ffi/defcfn method-moqbroadcastproducer-publish-media "uniffi_moq_ffi_fn_method_moqbroadcastproducer_publish_media" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :uint64) | |
| 324 | +(ffi/defcfn method-moqbroadcastproducer-publish-media-on-track "uniffi_moq_ffi_fn_method_moqbroadcastproducer_publish_media_on_track" [:uint64 :uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :uint64) | |
| 325 | +(ffi/defcfn method-moqbroadcastproducer-publish-media-stream "uniffi_moq_ffi_fn_method_moqbroadcastproducer_publish_media_stream" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :uint64) | |
| 326 | +(ffi/defcfn method-moqbroadcastproducer-publish-track "uniffi_moq_ffi_fn_method_moqbroadcastproducer_publish_track" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :uint64) | |
| 327 | +(ffi/defcfn method-moqbroadcastproducer-remove-catalog-section "uniffi_moq_ffi_fn_method_moqbroadcastproducer_remove_catalog_section" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | |
| 328 | +(ffi/defcfn method-moqbroadcastproducer-set-announce "uniffi_moq_ffi_fn_method_moqbroadcastproducer_set_announce" [:uint64 :int8 :pointer] :void) | |
| 329 | +(ffi/defcfn method-moqbroadcastproducer-set-catalog-section "uniffi_moq_ffi_fn_method_moqbroadcastproducer_set_catalog_section" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | |
| 330 | +(ffi/defcfn method-moqbroadcastproducer-set-route "uniffi_moq_ffi_fn_method_moqbroadcastproducer_set_route" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | |
| 331 | +(ffi/defcfn method-moqbroadcastproducer-set-video-properties "uniffi_moq_ffi_fn_method_moqbroadcastproducer_set_video_properties" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | |
| 332 | +(ffi/defcfn method-moqbroadcastrequest-abort "uniffi_moq_ffi_fn_method_moqbroadcastrequest_abort" [:uint64 :uint16 :pointer] :void) | |
| 333 | +(ffi/defcfn method-moqbroadcastrequest-accept "uniffi_moq_ffi_fn_method_moqbroadcastrequest_accept" [:uint64 :uint64 :pointer] :void) | |
| 334 | +(ffi/defcfn method-moqbroadcastrequest-path "uniffi_moq_ffi_fn_method_moqbroadcastrequest_path" [:uint64 :pointer] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]) | |
| 335 | +(ffi/defcfn method-moqcatalogconsumer-cancel "uniffi_moq_ffi_fn_method_moqcatalogconsumer_cancel" [:uint64 :pointer] :void) | |
| 336 | +(ffi/defcfn method-moqcatalogconsumer-next "uniffi_moq_ffi_fn_method_moqcatalogconsumer_next" [:uint64] :uint64) | |
| 337 | +(ffi/defcfn method-moqclient-cancel "uniffi_moq_ffi_fn_method_moqclient_cancel" [:uint64 :pointer] :void) | |
| 338 | +(ffi/defcfn method-moqclient-connect "uniffi_moq_ffi_fn_method_moqclient_connect" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]] :uint64) | |
| 339 | +(ffi/defcfn method-moqclient-set-bind "uniffi_moq_ffi_fn_method_moqclient_set_bind" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | |
| 340 | +(ffi/defcfn method-moqclient-set-consume "uniffi_moq_ffi_fn_method_moqclient_set_consume" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | |
| 341 | +(ffi/defcfn method-moqclient-set-publish "uniffi_moq_ffi_fn_method_moqclient_set_publish" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | |
| 342 | +(ffi/defcfn method-moqclient-set-tls-cert "uniffi_moq_ffi_fn_method_moqclient_set_tls_cert" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | |
| 343 | +(ffi/defcfn method-moqclient-set-tls-disable-verify "uniffi_moq_ffi_fn_method_moqclient_set_tls_disable_verify" [:uint64 :int8 :pointer] :void) | |
| 344 | +(ffi/defcfn method-moqclient-set-tls-fingerprints "uniffi_moq_ffi_fn_method_moqclient_set_tls_fingerprints" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | |
| 345 | +(ffi/defcfn method-moqclient-set-tls-key "uniffi_moq_ffi_fn_method_moqclient_set_tls_key" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | |
| 346 | +(ffi/defcfn method-moqclient-set-tls-roots "uniffi_moq_ffi_fn_method_moqclient_set_tls_roots" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | |
| 347 | +(ffi/defcfn method-moqclient-set-tls-system-roots "uniffi_moq_ffi_fn_method_moqclient_set_tls_system_roots" [:uint64 :int8 :pointer] :void) | |
| 348 | +(ffi/defcfn method-moqgroupconsumer-cancel "uniffi_moq_ffi_fn_method_moqgroupconsumer_cancel" [:uint64 :pointer] :void) | |
| 349 | +(ffi/defcfn method-moqgroupconsumer-read-frame "uniffi_moq_ffi_fn_method_moqgroupconsumer_read_frame" [:uint64] :uint64) | |
| 350 | +(ffi/defcfn method-moqgroupconsumer-sequence "uniffi_moq_ffi_fn_method_moqgroupconsumer_sequence" [:uint64 :pointer] :uint64) | |
| 351 | +(ffi/defcfn method-moqgroupproducer-abort "uniffi_moq_ffi_fn_method_moqgroupproducer_abort" [:uint64 :uint16 :pointer] :void) | |
| 352 | +(ffi/defcfn method-moqgroupproducer-consume "uniffi_moq_ffi_fn_method_moqgroupproducer_consume" [:uint64 :pointer] :uint64) | |
| 353 | +(ffi/defcfn method-moqgroupproducer-finish "uniffi_moq_ffi_fn_method_moqgroupproducer_finish" [:uint64 :pointer] :void) | |
| 354 | +(ffi/defcfn method-moqgroupproducer-sequence "uniffi_moq_ffi_fn_method_moqgroupproducer_sequence" [:uint64 :pointer] :uint64) | |
| 355 | +(ffi/defcfn method-moqgroupproducer-write-frame "uniffi_moq_ffi_fn_method_moqgroupproducer_write_frame" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | |
| 356 | +(ffi/defcfn method-moqgrouprequest-abort "uniffi_moq_ffi_fn_method_moqgrouprequest_abort" [:uint64 :uint16 :pointer] :void) | |
| 357 | +(ffi/defcfn method-moqgrouprequest-accept "uniffi_moq_ffi_fn_method_moqgrouprequest_accept" [:uint64 :pointer] :uint64) | |
| 358 | +(ffi/defcfn method-moqgrouprequest-priority "uniffi_moq_ffi_fn_method_moqgrouprequest_priority" [:uint64 :pointer] :uint8) | |
| 359 | +(ffi/defcfn method-moqgrouprequest-sequence "uniffi_moq_ffi_fn_method_moqgrouprequest_sequence" [:uint64 :pointer] :uint64) | |
| 360 | +(ffi/defcfn method-moqjsonsnapshotconsumer-cancel "uniffi_moq_ffi_fn_method_moqjsonsnapshotconsumer_cancel" [:uint64 :pointer] :void) | |
| 361 | +(ffi/defcfn method-moqjsonsnapshotconsumer-next "uniffi_moq_ffi_fn_method_moqjsonsnapshotconsumer_next" [:uint64] :uint64) | |
| 362 | +(ffi/defcfn method-moqjsonsnapshotproducer-finish "uniffi_moq_ffi_fn_method_moqjsonsnapshotproducer_finish" [:uint64 :pointer] :void) | |
| 363 | +(ffi/defcfn method-moqjsonsnapshotproducer-update "uniffi_moq_ffi_fn_method_moqjsonsnapshotproducer_update" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | |
| 364 | +(ffi/defcfn method-moqjsonstreamconsumer-cancel "uniffi_moq_ffi_fn_method_moqjsonstreamconsumer_cancel" [:uint64 :pointer] :void) | |
| 365 | +(ffi/defcfn method-moqjsonstreamconsumer-next "uniffi_moq_ffi_fn_method_moqjsonstreamconsumer_next" [:uint64] :uint64) | |
| 366 | +(ffi/defcfn method-moqjsonstreamproducer-append "uniffi_moq_ffi_fn_method_moqjsonstreamproducer_append" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | |
| 367 | +(ffi/defcfn method-moqjsonstreamproducer-finish "uniffi_moq_ffi_fn_method_moqjsonstreamproducer_finish" [:uint64 :pointer] :void) | |
| 368 | +(ffi/defcfn method-moqmediaconsumer-cancel "uniffi_moq_ffi_fn_method_moqmediaconsumer_cancel" [:uint64 :pointer] :void) | |
| 369 | +(ffi/defcfn method-moqmediaconsumer-next "uniffi_moq_ffi_fn_method_moqmediaconsumer_next" [:uint64] :uint64) | |
| 370 | +(ffi/defcfn method-moqmediagroupconsumer-cancel "uniffi_moq_ffi_fn_method_moqmediagroupconsumer_cancel" [:uint64 :pointer] :void) | |
| 371 | +(ffi/defcfn method-moqmediagroupconsumer-next "uniffi_moq_ffi_fn_method_moqmediagroupconsumer_next" [:uint64] :uint64) | |
| 372 | +(ffi/defcfn method-moqmediagroupconsumer-sequence "uniffi_moq_ffi_fn_method_moqmediagroupconsumer_sequence" [:uint64 :pointer] :uint64) | |
| 373 | +(ffi/defcfn method-moqmediaproducer-finish "uniffi_moq_ffi_fn_method_moqmediaproducer_finish" [:uint64 :pointer] :void) | |
| 374 | +(ffi/defcfn method-moqmediaproducer-name "uniffi_moq_ffi_fn_method_moqmediaproducer_name" [:uint64 :pointer] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]) | |
| 375 | +(ffi/defcfn method-moqmediaproducer-unused "uniffi_moq_ffi_fn_method_moqmediaproducer_unused" [:uint64] :uint64) | |
| 376 | +(ffi/defcfn method-moqmediaproducer-used "uniffi_moq_ffi_fn_method_moqmediaproducer_used" [:uint64] :uint64) | |
| 377 | +(ffi/defcfn method-moqmediaproducer-write-frame "uniffi_moq_ffi_fn_method_moqmediaproducer_write_frame" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | |
| 378 | +(ffi/defcfn method-moqmediastreamproducer-finish "uniffi_moq_ffi_fn_method_moqmediastreamproducer_finish" [:uint64 :pointer] :void) | |
| 379 | +(ffi/defcfn method-moqmediastreamproducer-write "uniffi_moq_ffi_fn_method_moqmediastreamproducer_write" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | |
| 380 | +(ffi/defcfn method-moqoriginconsumer-announced "uniffi_moq_ffi_fn_method_moqoriginconsumer_announced" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :uint64) | |
| 381 | +(ffi/defcfn method-moqoriginconsumer-announced-broadcast "uniffi_moq_ffi_fn_method_moqoriginconsumer_announced_broadcast" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :uint64) | |
| 382 | +(ffi/defcfn method-moqoriginconsumer-request-broadcast "uniffi_moq_ffi_fn_method_moqoriginconsumer_request_broadcast" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]] :uint64) | |
| 383 | +(ffi/defcfn method-moqorigindynamic-cancel "uniffi_moq_ffi_fn_method_moqorigindynamic_cancel" [:uint64 :pointer] :void) | |
| 384 | +(ffi/defcfn method-moqorigindynamic-requested-broadcast "uniffi_moq_ffi_fn_method_moqorigindynamic_requested_broadcast" [:uint64] :uint64) | |
| 385 | +(ffi/defcfn method-moqoriginproducer-consume "uniffi_moq_ffi_fn_method_moqoriginproducer_consume" [:uint64 :pointer] :uint64) | |
| 386 | +(ffi/defcfn method-moqoriginproducer-create-broadcast "uniffi_moq_ffi_fn_method_moqoriginproducer_create_broadcast" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :uint64) | |
| 387 | +(ffi/defcfn method-moqoriginproducer-dynamic "uniffi_moq_ffi_fn_method_moqoriginproducer_dynamic" [:uint64 :pointer] :uint64) | |
| 388 | +(ffi/defcfn method-moqrequest-accept "uniffi_moq_ffi_fn_method_moqrequest_accept" [:uint64] :uint64) | |
| 389 | +(ffi/defcfn method-moqrequest-cancel "uniffi_moq_ffi_fn_method_moqrequest_cancel" [:uint64 :pointer] :void) | |
| 390 | +(ffi/defcfn method-moqrequest-path "uniffi_moq_ffi_fn_method_moqrequest_path" [:uint64 :pointer] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]) | |
| 391 | +(ffi/defcfn method-moqrequest-query "uniffi_moq_ffi_fn_method_moqrequest_query" [:uint64 :pointer] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]) | |
| 392 | +(ffi/defcfn method-moqrequest-reject "uniffi_moq_ffi_fn_method_moqrequest_reject" [:uint64 :uint16] :uint64) | |
| 393 | +(ffi/defcfn method-moqrequest-set-consume "uniffi_moq_ffi_fn_method_moqrequest_set_consume" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | |
| 394 | +(ffi/defcfn method-moqrequest-set-publish "uniffi_moq_ffi_fn_method_moqrequest_set_publish" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | |
| 395 | +(ffi/defcfn method-moqrequest-transport "uniffi_moq_ffi_fn_method_moqrequest_transport" [:uint64 :pointer] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]) | |
| 396 | +(ffi/defcfn method-moqrequest-url "uniffi_moq_ffi_fn_method_moqrequest_url" [:uint64 :pointer] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]) | |
| 397 | +(ffi/defcfn method-moqroutewatch-cancel "uniffi_moq_ffi_fn_method_moqroutewatch_cancel" [:uint64 :pointer] :void) | |
| 398 | +(ffi/defcfn method-moqroutewatch-next "uniffi_moq_ffi_fn_method_moqroutewatch_next" [:uint64] :uint64) | |
| 399 | +(ffi/defcfn method-moqserver-accept "uniffi_moq_ffi_fn_method_moqserver_accept" [:uint64] :uint64) | |
| 400 | +(ffi/defcfn method-moqserver-cancel "uniffi_moq_ffi_fn_method_moqserver_cancel" [:uint64 :pointer] :void) | |
| 401 | +(ffi/defcfn method-moqserver-cert-fingerprints "uniffi_moq_ffi_fn_method_moqserver_cert_fingerprints" [:uint64 :pointer] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]) | |
| 402 | +(ffi/defcfn method-moqserver-listen "uniffi_moq_ffi_fn_method_moqserver_listen" [:uint64] :uint64) | |
| 403 | +(ffi/defcfn method-moqserver-set-bind "uniffi_moq_ffi_fn_method_moqserver_set_bind" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | |
| 404 | +(ffi/defcfn method-moqserver-set-consume "uniffi_moq_ffi_fn_method_moqserver_set_consume" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | |
| 405 | +(ffi/defcfn method-moqserver-set-publish "uniffi_moq_ffi_fn_method_moqserver_set_publish" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | |
| 406 | +(ffi/defcfn method-moqserver-set-tls-cert "uniffi_moq_ffi_fn_method_moqserver_set_tls_cert" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | |
| 407 | +(ffi/defcfn method-moqserver-set-tls-generate "uniffi_moq_ffi_fn_method_moqserver_set_tls_generate" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | |
| 408 | +(ffi/defcfn method-moqserver-set-tls-key "uniffi_moq_ffi_fn_method_moqserver_set_tls_key" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | |
| 409 | +(ffi/defcfn method-moqsession-cancel "uniffi_moq_ffi_fn_method_moqsession_cancel" [:uint64 :uint32 :pointer] :void) | |
| 410 | +(ffi/defcfn method-moqsession-closed "uniffi_moq_ffi_fn_method_moqsession_closed" [:uint64] :uint64) | |
| 411 | +(ffi/defcfn method-moqsession-consumer "uniffi_moq_ffi_fn_method_moqsession_consumer" [:uint64 :pointer] :uint64) | |
| 412 | +(ffi/defcfn method-moqsession-publisher "uniffi_moq_ffi_fn_method_moqsession_publisher" [:uint64 :pointer] :uint64) | |
| 413 | +(ffi/defcfn method-moqsession-shutdown "uniffi_moq_ffi_fn_method_moqsession_shutdown" [:uint64 :pointer] :void) | |
| 414 | +(ffi/defcfn method-moqsession-stats "uniffi_moq_ffi_fn_method_moqsession_stats" [:uint64 :pointer] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]) | |
| 415 | +(ffi/defcfn method-moqtrackconsumer-cancel "uniffi_moq_ffi_fn_method_moqtrackconsumer_cancel" [:uint64 :pointer] :void) | |
| 416 | +(ffi/defcfn method-moqtrackconsumer-info "uniffi_moq_ffi_fn_method_moqtrackconsumer_info" [:uint64 :pointer] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]) | |
| 417 | +(ffi/defcfn method-moqtrackconsumer-next-group "uniffi_moq_ffi_fn_method_moqtrackconsumer_next_group" [:uint64] :uint64) | |
| 418 | +(ffi/defcfn method-moqtrackconsumer-read-frame "uniffi_moq_ffi_fn_method_moqtrackconsumer_read_frame" [:uint64] :uint64) | |
| 419 | +(ffi/defcfn method-moqtrackconsumer-recv-datagram "uniffi_moq_ffi_fn_method_moqtrackconsumer_recv_datagram" [:uint64] :uint64) | |
| 420 | +(ffi/defcfn method-moqtrackconsumer-recv-group "uniffi_moq_ffi_fn_method_moqtrackconsumer_recv_group" [:uint64] :uint64) | |
| 421 | +(ffi/defcfn method-moqtrackconsumer-update "uniffi_moq_ffi_fn_method_moqtrackconsumer_update" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | |
| 422 | +(ffi/defcfn method-moqtrackdynamic-cancel "uniffi_moq_ffi_fn_method_moqtrackdynamic_cancel" [:uint64 :pointer] :void) | |
| 423 | +(ffi/defcfn method-moqtrackdynamic-requested-group "uniffi_moq_ffi_fn_method_moqtrackdynamic_requested_group" [:uint64] :uint64) | |
| 424 | +(ffi/defcfn method-moqtrackproducer-abort "uniffi_moq_ffi_fn_method_moqtrackproducer_abort" [:uint64 :uint16 :pointer] :void) | |
| 425 | +(ffi/defcfn method-moqtrackproducer-append-datagram "uniffi_moq_ffi_fn_method_moqtrackproducer_append_datagram" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :uint64) | |
| 426 | +(ffi/defcfn method-moqtrackproducer-append-group "uniffi_moq_ffi_fn_method_moqtrackproducer_append_group" [:uint64 :pointer] :uint64) | |
| 427 | +(ffi/defcfn method-moqtrackproducer-consume "uniffi_moq_ffi_fn_method_moqtrackproducer_consume" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :uint64) | |
| 428 | +(ffi/defcfn method-moqtrackproducer-create-group "uniffi_moq_ffi_fn_method_moqtrackproducer_create_group" [:uint64 :uint64 :pointer] :uint64) | |
| 429 | +(ffi/defcfn method-moqtrackproducer-dynamic "uniffi_moq_ffi_fn_method_moqtrackproducer_dynamic" [:uint64 :pointer] :uint64) | |
| 430 | +(ffi/defcfn method-moqtrackproducer-finish "uniffi_moq_ffi_fn_method_moqtrackproducer_finish" [:uint64 :pointer] :void) | |
| 431 | +(ffi/defcfn method-moqtrackproducer-finish-at "uniffi_moq_ffi_fn_method_moqtrackproducer_finish_at" [:uint64 :uint64 :pointer] :void) | |
| 432 | +(ffi/defcfn method-moqtrackproducer-name "uniffi_moq_ffi_fn_method_moqtrackproducer_name" [:uint64 :pointer] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]) | |
| 433 | +(ffi/defcfn method-moqtrackproducer-unused "uniffi_moq_ffi_fn_method_moqtrackproducer_unused" [:uint64] :uint64) | |
| 434 | +(ffi/defcfn method-moqtrackproducer-used "uniffi_moq_ffi_fn_method_moqtrackproducer_used" [:uint64] :uint64) | |
| 435 | +(ffi/defcfn method-moqtrackproducer-write-frame "uniffi_moq_ffi_fn_method_moqtrackproducer_write_frame" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | |
| 436 | +(ffi/defcfn method-moqtrackrequest-abort "uniffi_moq_ffi_fn_method_moqtrackrequest_abort" [:uint64 :uint16 :pointer] :void) | |
| 437 | +(ffi/defcfn method-moqtrackrequest-accept "uniffi_moq_ffi_fn_method_moqtrackrequest_accept" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :uint64) | |
| 438 | +(ffi/defcfn method-moqtrackrequest-dynamic "uniffi_moq_ffi_fn_method_moqtrackrequest_dynamic" [:uint64 :pointer] :uint64) | |
| 439 | +(ffi/defcfn method-moqtrackrequest-name "uniffi_moq_ffi_fn_method_moqtrackrequest_name" [:uint64 :pointer] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]) | |
| new file mode 100644 | |||
| @@ -0,0 +1,439 @@ | |||
| 1 | +(ns frq.moq.raw | ||
| 2 | + "Every entry point in libmoq_ffi, declared. GENERATED — do not edit. | ||
| 3 | + | ||
| 4 | + just gen-moq | ||
| 5 | + | ||
| 6 | + These are not transcribed from a header. UniFFI embeds its interface | ||
| 7 | + metadata in the object itself, and `uniffi-bindgen --library` reads it back | ||
| 8 | + out, so what is declared here is what the .so we ship actually exports — | ||
| 9 | + which matters more than it sounds. The release's Apple artifact and its | ||
| 10 | + Linux/Android ones are *different builds*: moq-ffi's `audio` and `video` | ||
| 11 | + features are on by default and were switched off for Linux and Android, so | ||
| 12 | + the shipped C header describes 230 entry points where the object we load has | ||
| 13 | + 403 symbols covering 206 functions, with `publish_audio`, `publish_video` | ||
| 14 | + and the whole `moqaudio*`/`moqvideo*` surface absent. Binding the header | ||
| 15 | + would have produced calls that link on a Mac and fail on the two platforms | ||
| 16 | + frq targets. | ||
| 17 | + | ||
| 18 | + Nothing here is hand-written and nothing is inferred. The generator maps a | ||
| 19 | + ctype it does not recognise to nothing at all and reports it, rather than | ||
| 20 | + guessing a width — a wrong one would be a silent memory bug rather than a | ||
| 21 | + compile error. | ||
| 22 | + | ||
| 23 | + Two shapes recur, and both are spelled out in full at every call site rather | ||
| 24 | + than named: `defcfn` is a macro whose types Chez fixes when it COMPILES the | ||
| 25 | + foreign procedure, so a `def`'d descriptor in type position has nothing to | ||
| 26 | + compile. Hence the literal [:by-value [:struct ...]] repeated throughout — | ||
| 27 | + it is the RustBuffer {capacity, len, data} triple, or the ForeignBytes pair. | ||
| 28 | + | ||
| 29 | + A trailing :pointer on a non-async function is its `RustCallStatus *` | ||
| 30 | + out-parameter; `frq.moq.uniffi/with-out-status` is what supplies one. An | ||
| 31 | + async function has no status and answers a future handle instead — poll it | ||
| 32 | + through `frq.moq.uniffi/start-future`. | ||
| 33 | + | ||
| 34 | + Generated from moq-ffi 0.3.17, UniFFI contract 30." | ||
| 35 | + (:require [jolt.ffi :as ffi])) | ||
| 36 | + | ||
| 37 | +(ffi/defcfn rust-future-cancel-f32 "ffi_moq_ffi_rust_future_cancel_f32" [:uint64] :void) | ||
| 38 | +(ffi/defcfn rust-future-cancel-f64 "ffi_moq_ffi_rust_future_cancel_f64" [:uint64] :void) | ||
| 39 | +(ffi/defcfn rust-future-cancel-i16 "ffi_moq_ffi_rust_future_cancel_i16" [:uint64] :void) | ||
| 40 | +(ffi/defcfn rust-future-cancel-i32 "ffi_moq_ffi_rust_future_cancel_i32" [:uint64] :void) | ||
| 41 | +(ffi/defcfn rust-future-cancel-i64 "ffi_moq_ffi_rust_future_cancel_i64" [:uint64] :void) | ||
| 42 | +(ffi/defcfn rust-future-cancel-i8 "ffi_moq_ffi_rust_future_cancel_i8" [:uint64] :void) | ||
| 43 | +(ffi/defcfn rust-future-cancel-rust-buffer "ffi_moq_ffi_rust_future_cancel_rust_buffer" [:uint64] :void) | ||
| 44 | +(ffi/defcfn rust-future-cancel-u16 "ffi_moq_ffi_rust_future_cancel_u16" [:uint64] :void) | ||
| 45 | +(ffi/defcfn rust-future-cancel-u32 "ffi_moq_ffi_rust_future_cancel_u32" [:uint64] :void) | ||
| 46 | +(ffi/defcfn rust-future-cancel-u64 "ffi_moq_ffi_rust_future_cancel_u64" [:uint64] :void) | ||
| 47 | +(ffi/defcfn rust-future-cancel-u8 "ffi_moq_ffi_rust_future_cancel_u8" [:uint64] :void) | ||
| 48 | +(ffi/defcfn rust-future-cancel-void "ffi_moq_ffi_rust_future_cancel_void" [:uint64] :void) | ||
| 49 | +(ffi/defcfn rust-future-complete-f32 "ffi_moq_ffi_rust_future_complete_f32" [:uint64 :pointer] :float) | ||
| 50 | +(ffi/defcfn rust-future-complete-f64 "ffi_moq_ffi_rust_future_complete_f64" [:uint64 :pointer] :double) | ||
| 51 | +(ffi/defcfn rust-future-complete-i16 "ffi_moq_ffi_rust_future_complete_i16" [:uint64 :pointer] :int16) | ||
| 52 | +(ffi/defcfn rust-future-complete-i32 "ffi_moq_ffi_rust_future_complete_i32" [:uint64 :pointer] :int32) | ||
| 53 | +(ffi/defcfn rust-future-complete-i64 "ffi_moq_ffi_rust_future_complete_i64" [:uint64 :pointer] :int64) | ||
| 54 | +(ffi/defcfn rust-future-complete-i8 "ffi_moq_ffi_rust_future_complete_i8" [:uint64 :pointer] :int8) | ||
| 55 | +(ffi/defcfn rust-future-complete-rust-buffer "ffi_moq_ffi_rust_future_complete_rust_buffer" [:uint64 :pointer] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]) | ||
| 56 | +(ffi/defcfn rust-future-complete-u16 "ffi_moq_ffi_rust_future_complete_u16" [:uint64 :pointer] :uint16) | ||
| 57 | +(ffi/defcfn rust-future-complete-u32 "ffi_moq_ffi_rust_future_complete_u32" [:uint64 :pointer] :uint32) | ||
| 58 | +(ffi/defcfn rust-future-complete-u64 "ffi_moq_ffi_rust_future_complete_u64" [:uint64 :pointer] :uint64) | ||
| 59 | +(ffi/defcfn rust-future-complete-u8 "ffi_moq_ffi_rust_future_complete_u8" [:uint64 :pointer] :uint8) | ||
| 60 | +(ffi/defcfn rust-future-complete-void "ffi_moq_ffi_rust_future_complete_void" [:uint64 :pointer] :void) | ||
| 61 | +(ffi/defcfn rust-future-free-f32 "ffi_moq_ffi_rust_future_free_f32" [:uint64] :void) | ||
| 62 | +(ffi/defcfn rust-future-free-f64 "ffi_moq_ffi_rust_future_free_f64" [:uint64] :void) | ||
| 63 | +(ffi/defcfn rust-future-free-i16 "ffi_moq_ffi_rust_future_free_i16" [:uint64] :void) | ||
| 64 | +(ffi/defcfn rust-future-free-i32 "ffi_moq_ffi_rust_future_free_i32" [:uint64] :void) | ||
| 65 | +(ffi/defcfn rust-future-free-i64 "ffi_moq_ffi_rust_future_free_i64" [:uint64] :void) | ||
| 66 | +(ffi/defcfn rust-future-free-i8 "ffi_moq_ffi_rust_future_free_i8" [:uint64] :void) | ||
| 67 | +(ffi/defcfn rust-future-free-rust-buffer "ffi_moq_ffi_rust_future_free_rust_buffer" [:uint64] :void) | ||
| 68 | +(ffi/defcfn rust-future-free-u16 "ffi_moq_ffi_rust_future_free_u16" [:uint64] :void) | ||
| 69 | +(ffi/defcfn rust-future-free-u32 "ffi_moq_ffi_rust_future_free_u32" [:uint64] :void) | ||
| 70 | +(ffi/defcfn rust-future-free-u64 "ffi_moq_ffi_rust_future_free_u64" [:uint64] :void) | ||
| 71 | +(ffi/defcfn rust-future-free-u8 "ffi_moq_ffi_rust_future_free_u8" [:uint64] :void) | ||
| 72 | +(ffi/defcfn rust-future-free-void "ffi_moq_ffi_rust_future_free_void" [:uint64] :void) | ||
| 73 | +(ffi/defcfn rust-future-poll-f32 "ffi_moq_ffi_rust_future_poll_f32" [:uint64 :pointer :uint64] :void) | ||
| 74 | +(ffi/defcfn rust-future-poll-f64 "ffi_moq_ffi_rust_future_poll_f64" [:uint64 :pointer :uint64] :void) | ||
| 75 | +(ffi/defcfn rust-future-poll-i16 "ffi_moq_ffi_rust_future_poll_i16" [:uint64 :pointer :uint64] :void) | ||
| 76 | +(ffi/defcfn rust-future-poll-i32 "ffi_moq_ffi_rust_future_poll_i32" [:uint64 :pointer :uint64] :void) | ||
| 77 | +(ffi/defcfn rust-future-poll-i64 "ffi_moq_ffi_rust_future_poll_i64" [:uint64 :pointer :uint64] :void) | ||
| 78 | +(ffi/defcfn rust-future-poll-i8 "ffi_moq_ffi_rust_future_poll_i8" [:uint64 :pointer :uint64] :void) | ||
| 79 | +(ffi/defcfn rust-future-poll-rust-buffer "ffi_moq_ffi_rust_future_poll_rust_buffer" [:uint64 :pointer :uint64] :void) | ||
| 80 | +(ffi/defcfn rust-future-poll-u16 "ffi_moq_ffi_rust_future_poll_u16" [:uint64 :pointer :uint64] :void) | ||
| 81 | +(ffi/defcfn rust-future-poll-u32 "ffi_moq_ffi_rust_future_poll_u32" [:uint64 :pointer :uint64] :void) | ||
| 82 | +(ffi/defcfn rust-future-poll-u64 "ffi_moq_ffi_rust_future_poll_u64" [:uint64 :pointer :uint64] :void) | ||
| 83 | +(ffi/defcfn rust-future-poll-u8 "ffi_moq_ffi_rust_future_poll_u8" [:uint64 :pointer :uint64] :void) | ||
| 84 | +(ffi/defcfn rust-future-poll-void "ffi_moq_ffi_rust_future_poll_void" [:uint64 :pointer :uint64] :void) | ||
| 85 | +(ffi/defcfn rustbuffer-alloc "ffi_moq_ffi_rustbuffer_alloc" [:uint64 :pointer] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]) | ||
| 86 | +(ffi/defcfn rustbuffer-free "ffi_moq_ffi_rustbuffer_free" [[:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | ||
| 87 | +(ffi/defcfn rustbuffer-from-bytes "ffi_moq_ffi_rustbuffer_from_bytes" [[:by-value [:struct [[:len :int32] [:data :pointer]]]] :pointer] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]) | ||
| 88 | +(ffi/defcfn rustbuffer-reserve "ffi_moq_ffi_rustbuffer_reserve" [[:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :uint64 :pointer] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]) | ||
| 89 | +(ffi/defcfn uniffi-contract-version "ffi_moq_ffi_uniffi_contract_version" [] :uint32) | ||
| 90 | +(ffi/defcfn checksum-constructor-moqbroadcastproducer-new "uniffi_moq_ffi_checksum_constructor_moqbroadcastproducer_new" [] :uint16) | ||
| 91 | +(ffi/defcfn checksum-constructor-moqclient-new "uniffi_moq_ffi_checksum_constructor_moqclient_new" [] :uint16) | ||
| 92 | +(ffi/defcfn checksum-constructor-moqoriginproducer-new "uniffi_moq_ffi_checksum_constructor_moqoriginproducer_new" [] :uint16) | ||
| 93 | +(ffi/defcfn checksum-constructor-moqserver-new "uniffi_moq_ffi_checksum_constructor_moqserver_new" [] :uint16) | ||
| 94 | +(ffi/defcfn checksum-func-moq-log-level "uniffi_moq_ffi_checksum_func_moq_log_level" [] :uint16) | ||
| 95 | +(ffi/defcfn checksum-method-moqannounced-cancel "uniffi_moq_ffi_checksum_method_moqannounced_cancel" [] :uint16) | ||
| 96 | +(ffi/defcfn checksum-method-moqannounced-next "uniffi_moq_ffi_checksum_method_moqannounced_next" [] :uint16) | ||
| 97 | +(ffi/defcfn checksum-method-moqannouncedbroadcast-available "uniffi_moq_ffi_checksum_method_moqannouncedbroadcast_available" [] :uint16) | ||
| 98 | +(ffi/defcfn checksum-method-moqannouncedbroadcast-cancel "uniffi_moq_ffi_checksum_method_moqannouncedbroadcast_cancel" [] :uint16) | ||
| 99 | +(ffi/defcfn checksum-method-moqannouncement-broadcast "uniffi_moq_ffi_checksum_method_moqannouncement_broadcast" [] :uint16) | ||
| 100 | +(ffi/defcfn checksum-method-moqannouncement-path "uniffi_moq_ffi_checksum_method_moqannouncement_path" [] :uint16) | ||
| 101 | +(ffi/defcfn checksum-method-moqbroadcastconsumer-fetch-group "uniffi_moq_ffi_checksum_method_moqbroadcastconsumer_fetch_group" [] :uint16) | ||
| 102 | +(ffi/defcfn checksum-method-moqbroadcastconsumer-fetch-media-group "uniffi_moq_ffi_checksum_method_moqbroadcastconsumer_fetch_media_group" [] :uint16) | ||
| 103 | +(ffi/defcfn checksum-method-moqbroadcastconsumer-route "uniffi_moq_ffi_checksum_method_moqbroadcastconsumer_route" [] :uint16) | ||
| 104 | +(ffi/defcfn checksum-method-moqbroadcastconsumer-route-updates "uniffi_moq_ffi_checksum_method_moqbroadcastconsumer_route_updates" [] :uint16) | ||
| 105 | +(ffi/defcfn checksum-method-moqbroadcastconsumer-subscribe-catalog "uniffi_moq_ffi_checksum_method_moqbroadcastconsumer_subscribe_catalog" [] :uint16) | ||
| 106 | +(ffi/defcfn checksum-method-moqbroadcastconsumer-subscribe-json-snapshot "uniffi_moq_ffi_checksum_method_moqbroadcastconsumer_subscribe_json_snapshot" [] :uint16) | ||
| 107 | +(ffi/defcfn checksum-method-moqbroadcastconsumer-subscribe-json-stream "uniffi_moq_ffi_checksum_method_moqbroadcastconsumer_subscribe_json_stream" [] :uint16) | ||
| 108 | +(ffi/defcfn checksum-method-moqbroadcastconsumer-subscribe-media "uniffi_moq_ffi_checksum_method_moqbroadcastconsumer_subscribe_media" [] :uint16) | ||
| 109 | +(ffi/defcfn checksum-method-moqbroadcastconsumer-subscribe-track "uniffi_moq_ffi_checksum_method_moqbroadcastconsumer_subscribe_track" [] :uint16) | ||
| 110 | +(ffi/defcfn checksum-method-moqbroadcastdynamic-cancel "uniffi_moq_ffi_checksum_method_moqbroadcastdynamic_cancel" [] :uint16) | ||
| 111 | +(ffi/defcfn checksum-method-moqbroadcastdynamic-requested-track "uniffi_moq_ffi_checksum_method_moqbroadcastdynamic_requested_track" [] :uint16) | ||
| 112 | +(ffi/defcfn checksum-method-moqbroadcastproducer-consume "uniffi_moq_ffi_checksum_method_moqbroadcastproducer_consume" [] :uint16) | ||
| 113 | +(ffi/defcfn checksum-method-moqbroadcastproducer-dynamic "uniffi_moq_ffi_checksum_method_moqbroadcastproducer_dynamic" [] :uint16) | ||
| 114 | +(ffi/defcfn checksum-method-moqbroadcastproducer-finish "uniffi_moq_ffi_checksum_method_moqbroadcastproducer_finish" [] :uint16) | ||
| 115 | +(ffi/defcfn checksum-method-moqbroadcastproducer-publish-json-snapshot "uniffi_moq_ffi_checksum_method_moqbroadcastproducer_publish_json_snapshot" [] :uint16) | ||
| 116 | +(ffi/defcfn checksum-method-moqbroadcastproducer-publish-json-stream "uniffi_moq_ffi_checksum_method_moqbroadcastproducer_publish_json_stream" [] :uint16) | ||
| 117 | +(ffi/defcfn checksum-method-moqbroadcastproducer-publish-media "uniffi_moq_ffi_checksum_method_moqbroadcastproducer_publish_media" [] :uint16) | ||
| 118 | +(ffi/defcfn checksum-method-moqbroadcastproducer-publish-media-on-track "uniffi_moq_ffi_checksum_method_moqbroadcastproducer_publish_media_on_track" [] :uint16) | ||
| 119 | +(ffi/defcfn checksum-method-moqbroadcastproducer-publish-media-stream "uniffi_moq_ffi_checksum_method_moqbroadcastproducer_publish_media_stream" [] :uint16) | ||
| 120 | +(ffi/defcfn checksum-method-moqbroadcastproducer-publish-track "uniffi_moq_ffi_checksum_method_moqbroadcastproducer_publish_track" [] :uint16) | ||
| 121 | +(ffi/defcfn checksum-method-moqbroadcastproducer-remove-catalog-section "uniffi_moq_ffi_checksum_method_moqbroadcastproducer_remove_catalog_section" [] :uint16) | ||
| 122 | +(ffi/defcfn checksum-method-moqbroadcastproducer-set-announce "uniffi_moq_ffi_checksum_method_moqbroadcastproducer_set_announce" [] :uint16) | ||
| 123 | +(ffi/defcfn checksum-method-moqbroadcastproducer-set-catalog-section "uniffi_moq_ffi_checksum_method_moqbroadcastproducer_set_catalog_section" [] :uint16) | ||
| 124 | +(ffi/defcfn checksum-method-moqbroadcastproducer-set-route "uniffi_moq_ffi_checksum_method_moqbroadcastproducer_set_route" [] :uint16) | ||
| 125 | +(ffi/defcfn checksum-method-moqbroadcastproducer-set-video-properties "uniffi_moq_ffi_checksum_method_moqbroadcastproducer_set_video_properties" [] :uint16) | ||
| 126 | +(ffi/defcfn checksum-method-moqbroadcastrequest-abort "uniffi_moq_ffi_checksum_method_moqbroadcastrequest_abort" [] :uint16) | ||
| 127 | +(ffi/defcfn checksum-method-moqbroadcastrequest-accept "uniffi_moq_ffi_checksum_method_moqbroadcastrequest_accept" [] :uint16) | ||
| 128 | +(ffi/defcfn checksum-method-moqbroadcastrequest-path "uniffi_moq_ffi_checksum_method_moqbroadcastrequest_path" [] :uint16) | ||
| 129 | +(ffi/defcfn checksum-method-moqcatalogconsumer-cancel "uniffi_moq_ffi_checksum_method_moqcatalogconsumer_cancel" [] :uint16) | ||
| 130 | +(ffi/defcfn checksum-method-moqcatalogconsumer-next "uniffi_moq_ffi_checksum_method_moqcatalogconsumer_next" [] :uint16) | ||
| 131 | +(ffi/defcfn checksum-method-moqclient-cancel "uniffi_moq_ffi_checksum_method_moqclient_cancel" [] :uint16) | ||
| 132 | +(ffi/defcfn checksum-method-moqclient-connect "uniffi_moq_ffi_checksum_method_moqclient_connect" [] :uint16) | ||
| 133 | +(ffi/defcfn checksum-method-moqclient-set-bind "uniffi_moq_ffi_checksum_method_moqclient_set_bind" [] :uint16) | ||
| 134 | +(ffi/defcfn checksum-method-moqclient-set-consume "uniffi_moq_ffi_checksum_method_moqclient_set_consume" [] :uint16) | ||
| 135 | +(ffi/defcfn checksum-method-moqclient-set-publish "uniffi_moq_ffi_checksum_method_moqclient_set_publish" [] :uint16) | ||
| 136 | +(ffi/defcfn checksum-method-moqclient-set-tls-cert "uniffi_moq_ffi_checksum_method_moqclient_set_tls_cert" [] :uint16) | ||
| 137 | +(ffi/defcfn checksum-method-moqclient-set-tls-disable-verify "uniffi_moq_ffi_checksum_method_moqclient_set_tls_disable_verify" [] :uint16) | ||
| 138 | +(ffi/defcfn checksum-method-moqclient-set-tls-fingerprints "uniffi_moq_ffi_checksum_method_moqclient_set_tls_fingerprints" [] :uint16) | ||
| 139 | +(ffi/defcfn checksum-method-moqclient-set-tls-key "uniffi_moq_ffi_checksum_method_moqclient_set_tls_key" [] :uint16) | ||
| 140 | +(ffi/defcfn checksum-method-moqclient-set-tls-roots "uniffi_moq_ffi_checksum_method_moqclient_set_tls_roots" [] :uint16) | ||
| 141 | +(ffi/defcfn checksum-method-moqclient-set-tls-system-roots "uniffi_moq_ffi_checksum_method_moqclient_set_tls_system_roots" [] :uint16) | ||
| 142 | +(ffi/defcfn checksum-method-moqgroupconsumer-cancel "uniffi_moq_ffi_checksum_method_moqgroupconsumer_cancel" [] :uint16) | ||
| 143 | +(ffi/defcfn checksum-method-moqgroupconsumer-read-frame "uniffi_moq_ffi_checksum_method_moqgroupconsumer_read_frame" [] :uint16) | ||
| 144 | +(ffi/defcfn checksum-method-moqgroupconsumer-sequence "uniffi_moq_ffi_checksum_method_moqgroupconsumer_sequence" [] :uint16) | ||
| 145 | +(ffi/defcfn checksum-method-moqgroupproducer-abort "uniffi_moq_ffi_checksum_method_moqgroupproducer_abort" [] :uint16) | ||
| 146 | +(ffi/defcfn checksum-method-moqgroupproducer-consume "uniffi_moq_ffi_checksum_method_moqgroupproducer_consume" [] :uint16) | ||
| 147 | +(ffi/defcfn checksum-method-moqgroupproducer-finish "uniffi_moq_ffi_checksum_method_moqgroupproducer_finish" [] :uint16) | ||
| 148 | +(ffi/defcfn checksum-method-moqgroupproducer-sequence "uniffi_moq_ffi_checksum_method_moqgroupproducer_sequence" [] :uint16) | ||
| 149 | +(ffi/defcfn checksum-method-moqgroupproducer-write-frame "uniffi_moq_ffi_checksum_method_moqgroupproducer_write_frame" [] :uint16) | ||
| 150 | +(ffi/defcfn checksum-method-moqgrouprequest-abort "uniffi_moq_ffi_checksum_method_moqgrouprequest_abort" [] :uint16) | ||
| 151 | +(ffi/defcfn checksum-method-moqgrouprequest-accept "uniffi_moq_ffi_checksum_method_moqgrouprequest_accept" [] :uint16) | ||
| 152 | +(ffi/defcfn checksum-method-moqgrouprequest-priority "uniffi_moq_ffi_checksum_method_moqgrouprequest_priority" [] :uint16) | ||
| 153 | +(ffi/defcfn checksum-method-moqgrouprequest-sequence "uniffi_moq_ffi_checksum_method_moqgrouprequest_sequence" [] :uint16) | ||
| 154 | +(ffi/defcfn checksum-method-moqjsonsnapshotconsumer-cancel "uniffi_moq_ffi_checksum_method_moqjsonsnapshotconsumer_cancel" [] :uint16) | ||
| 155 | +(ffi/defcfn checksum-method-moqjsonsnapshotconsumer-next "uniffi_moq_ffi_checksum_method_moqjsonsnapshotconsumer_next" [] :uint16) | ||
| 156 | +(ffi/defcfn checksum-method-moqjsonsnapshotproducer-finish "uniffi_moq_ffi_checksum_method_moqjsonsnapshotproducer_finish" [] :uint16) | ||
| 157 | +(ffi/defcfn checksum-method-moqjsonsnapshotproducer-update "uniffi_moq_ffi_checksum_method_moqjsonsnapshotproducer_update" [] :uint16) | ||
| 158 | +(ffi/defcfn checksum-method-moqjsonstreamconsumer-cancel "uniffi_moq_ffi_checksum_method_moqjsonstreamconsumer_cancel" [] :uint16) | ||
| 159 | +(ffi/defcfn checksum-method-moqjsonstreamconsumer-next "uniffi_moq_ffi_checksum_method_moqjsonstreamconsumer_next" [] :uint16) | ||
| 160 | +(ffi/defcfn checksum-method-moqjsonstreamproducer-append "uniffi_moq_ffi_checksum_method_moqjsonstreamproducer_append" [] :uint16) | ||
| 161 | +(ffi/defcfn checksum-method-moqjsonstreamproducer-finish "uniffi_moq_ffi_checksum_method_moqjsonstreamproducer_finish" [] :uint16) | ||
| 162 | +(ffi/defcfn checksum-method-moqmediaconsumer-cancel "uniffi_moq_ffi_checksum_method_moqmediaconsumer_cancel" [] :uint16) | ||
| 163 | +(ffi/defcfn checksum-method-moqmediaconsumer-next "uniffi_moq_ffi_checksum_method_moqmediaconsumer_next" [] :uint16) | ||
| 164 | +(ffi/defcfn checksum-method-moqmediagroupconsumer-cancel "uniffi_moq_ffi_checksum_method_moqmediagroupconsumer_cancel" [] :uint16) | ||
| 165 | +(ffi/defcfn checksum-method-moqmediagroupconsumer-next "uniffi_moq_ffi_checksum_method_moqmediagroupconsumer_next" [] :uint16) | ||
| 166 | +(ffi/defcfn checksum-method-moqmediagroupconsumer-sequence "uniffi_moq_ffi_checksum_method_moqmediagroupconsumer_sequence" [] :uint16) | ||
| 167 | +(ffi/defcfn checksum-method-moqmediaproducer-finish "uniffi_moq_ffi_checksum_method_moqmediaproducer_finish" [] :uint16) | ||
| 168 | +(ffi/defcfn checksum-method-moqmediaproducer-name "uniffi_moq_ffi_checksum_method_moqmediaproducer_name" [] :uint16) | ||
| 169 | +(ffi/defcfn checksum-method-moqmediaproducer-unused "uniffi_moq_ffi_checksum_method_moqmediaproducer_unused" [] :uint16) | ||
| 170 | +(ffi/defcfn checksum-method-moqmediaproducer-used "uniffi_moq_ffi_checksum_method_moqmediaproducer_used" [] :uint16) | ||
| 171 | +(ffi/defcfn checksum-method-moqmediaproducer-write-frame "uniffi_moq_ffi_checksum_method_moqmediaproducer_write_frame" [] :uint16) | ||
| 172 | +(ffi/defcfn checksum-method-moqmediastreamproducer-finish "uniffi_moq_ffi_checksum_method_moqmediastreamproducer_finish" [] :uint16) | ||
| 173 | +(ffi/defcfn checksum-method-moqmediastreamproducer-write "uniffi_moq_ffi_checksum_method_moqmediastreamproducer_write" [] :uint16) | ||
| 174 | +(ffi/defcfn checksum-method-moqoriginconsumer-announced "uniffi_moq_ffi_checksum_method_moqoriginconsumer_announced" [] :uint16) | ||
| 175 | +(ffi/defcfn checksum-method-moqoriginconsumer-announced-broadcast "uniffi_moq_ffi_checksum_method_moqoriginconsumer_announced_broadcast" [] :uint16) | ||
| 176 | +(ffi/defcfn checksum-method-moqoriginconsumer-request-broadcast "uniffi_moq_ffi_checksum_method_moqoriginconsumer_request_broadcast" [] :uint16) | ||
| 177 | +(ffi/defcfn checksum-method-moqorigindynamic-cancel "uniffi_moq_ffi_checksum_method_moqorigindynamic_cancel" [] :uint16) | ||
| 178 | +(ffi/defcfn checksum-method-moqorigindynamic-requested-broadcast "uniffi_moq_ffi_checksum_method_moqorigindynamic_requested_broadcast" [] :uint16) | ||
| 179 | +(ffi/defcfn checksum-method-moqoriginproducer-consume "uniffi_moq_ffi_checksum_method_moqoriginproducer_consume" [] :uint16) | ||
| 180 | +(ffi/defcfn checksum-method-moqoriginproducer-create-broadcast "uniffi_moq_ffi_checksum_method_moqoriginproducer_create_broadcast" [] :uint16) | ||
| 181 | +(ffi/defcfn checksum-method-moqoriginproducer-dynamic "uniffi_moq_ffi_checksum_method_moqoriginproducer_dynamic" [] :uint16) | ||
| 182 | +(ffi/defcfn checksum-method-moqrequest-accept "uniffi_moq_ffi_checksum_method_moqrequest_accept" [] :uint16) | ||
| 183 | +(ffi/defcfn checksum-method-moqrequest-cancel "uniffi_moq_ffi_checksum_method_moqrequest_cancel" [] :uint16) | ||
| 184 | +(ffi/defcfn checksum-method-moqrequest-path "uniffi_moq_ffi_checksum_method_moqrequest_path" [] :uint16) | ||
| 185 | +(ffi/defcfn checksum-method-moqrequest-query "uniffi_moq_ffi_checksum_method_moqrequest_query" [] :uint16) | ||
| 186 | +(ffi/defcfn checksum-method-moqrequest-reject "uniffi_moq_ffi_checksum_method_moqrequest_reject" [] :uint16) | ||
| 187 | +(ffi/defcfn checksum-method-moqrequest-set-consume "uniffi_moq_ffi_checksum_method_moqrequest_set_consume" [] :uint16) | ||
| 188 | +(ffi/defcfn checksum-method-moqrequest-set-publish "uniffi_moq_ffi_checksum_method_moqrequest_set_publish" [] :uint16) | ||
| 189 | +(ffi/defcfn checksum-method-moqrequest-transport "uniffi_moq_ffi_checksum_method_moqrequest_transport" [] :uint16) | ||
| 190 | +(ffi/defcfn checksum-method-moqrequest-url "uniffi_moq_ffi_checksum_method_moqrequest_url" [] :uint16) | ||
| 191 | +(ffi/defcfn checksum-method-moqroutewatch-cancel "uniffi_moq_ffi_checksum_method_moqroutewatch_cancel" [] :uint16) | ||
| 192 | +(ffi/defcfn checksum-method-moqroutewatch-next "uniffi_moq_ffi_checksum_method_moqroutewatch_next" [] :uint16) | ||
| 193 | +(ffi/defcfn checksum-method-moqserver-accept "uniffi_moq_ffi_checksum_method_moqserver_accept" [] :uint16) | ||
| 194 | +(ffi/defcfn checksum-method-moqserver-cancel "uniffi_moq_ffi_checksum_method_moqserver_cancel" [] :uint16) | ||
| 195 | +(ffi/defcfn checksum-method-moqserver-cert-fingerprints "uniffi_moq_ffi_checksum_method_moqserver_cert_fingerprints" [] :uint16) | ||
| 196 | +(ffi/defcfn checksum-method-moqserver-listen "uniffi_moq_ffi_checksum_method_moqserver_listen" [] :uint16) | ||
| 197 | +(ffi/defcfn checksum-method-moqserver-set-bind "uniffi_moq_ffi_checksum_method_moqserver_set_bind" [] :uint16) | ||
| 198 | +(ffi/defcfn checksum-method-moqserver-set-consume "uniffi_moq_ffi_checksum_method_moqserver_set_consume" [] :uint16) | ||
| 199 | +(ffi/defcfn checksum-method-moqserver-set-publish "uniffi_moq_ffi_checksum_method_moqserver_set_publish" [] :uint16) | ||
| 200 | +(ffi/defcfn checksum-method-moqserver-set-tls-cert "uniffi_moq_ffi_checksum_method_moqserver_set_tls_cert" [] :uint16) | ||
| 201 | +(ffi/defcfn checksum-method-moqserver-set-tls-generate "uniffi_moq_ffi_checksum_method_moqserver_set_tls_generate" [] :uint16) | ||
| 202 | +(ffi/defcfn checksum-method-moqserver-set-tls-key "uniffi_moq_ffi_checksum_method_moqserver_set_tls_key" [] :uint16) | ||
| 203 | +(ffi/defcfn checksum-method-moqsession-cancel "uniffi_moq_ffi_checksum_method_moqsession_cancel" [] :uint16) | ||
| 204 | +(ffi/defcfn checksum-method-moqsession-closed "uniffi_moq_ffi_checksum_method_moqsession_closed" [] :uint16) | ||
| 205 | +(ffi/defcfn checksum-method-moqsession-consumer "uniffi_moq_ffi_checksum_method_moqsession_consumer" [] :uint16) | ||
| 206 | +(ffi/defcfn checksum-method-moqsession-publisher "uniffi_moq_ffi_checksum_method_moqsession_publisher" [] :uint16) | ||
| 207 | +(ffi/defcfn checksum-method-moqsession-shutdown "uniffi_moq_ffi_checksum_method_moqsession_shutdown" [] :uint16) | ||
| 208 | +(ffi/defcfn checksum-method-moqsession-stats "uniffi_moq_ffi_checksum_method_moqsession_stats" [] :uint16) | ||
| 209 | +(ffi/defcfn checksum-method-moqtrackconsumer-cancel "uniffi_moq_ffi_checksum_method_moqtrackconsumer_cancel" [] :uint16) | ||
| 210 | +(ffi/defcfn checksum-method-moqtrackconsumer-info "uniffi_moq_ffi_checksum_method_moqtrackconsumer_info" [] :uint16) | ||
| 211 | +(ffi/defcfn checksum-method-moqtrackconsumer-next-group "uniffi_moq_ffi_checksum_method_moqtrackconsumer_next_group" [] :uint16) | ||
| 212 | +(ffi/defcfn checksum-method-moqtrackconsumer-read-frame "uniffi_moq_ffi_checksum_method_moqtrackconsumer_read_frame" [] :uint16) | ||
| 213 | +(ffi/defcfn checksum-method-moqtrackconsumer-recv-datagram "uniffi_moq_ffi_checksum_method_moqtrackconsumer_recv_datagram" [] :uint16) | ||
| 214 | +(ffi/defcfn checksum-method-moqtrackconsumer-recv-group "uniffi_moq_ffi_checksum_method_moqtrackconsumer_recv_group" [] :uint16) | ||
| 215 | +(ffi/defcfn checksum-method-moqtrackconsumer-update "uniffi_moq_ffi_checksum_method_moqtrackconsumer_update" [] :uint16) | ||
| 216 | +(ffi/defcfn checksum-method-moqtrackdynamic-cancel "uniffi_moq_ffi_checksum_method_moqtrackdynamic_cancel" [] :uint16) | ||
| 217 | +(ffi/defcfn checksum-method-moqtrackdynamic-requested-group "uniffi_moq_ffi_checksum_method_moqtrackdynamic_requested_group" [] :uint16) | ||
| 218 | +(ffi/defcfn checksum-method-moqtrackproducer-abort "uniffi_moq_ffi_checksum_method_moqtrackproducer_abort" [] :uint16) | ||
| 219 | +(ffi/defcfn checksum-method-moqtrackproducer-append-datagram "uniffi_moq_ffi_checksum_method_moqtrackproducer_append_datagram" [] :uint16) | ||
| 220 | +(ffi/defcfn checksum-method-moqtrackproducer-append-group "uniffi_moq_ffi_checksum_method_moqtrackproducer_append_group" [] :uint16) | ||
| 221 | +(ffi/defcfn checksum-method-moqtrackproducer-consume "uniffi_moq_ffi_checksum_method_moqtrackproducer_consume" [] :uint16) | ||
| 222 | +(ffi/defcfn checksum-method-moqtrackproducer-create-group "uniffi_moq_ffi_checksum_method_moqtrackproducer_create_group" [] :uint16) | ||
| 223 | +(ffi/defcfn checksum-method-moqtrackproducer-dynamic "uniffi_moq_ffi_checksum_method_moqtrackproducer_dynamic" [] :uint16) | ||
| 224 | +(ffi/defcfn checksum-method-moqtrackproducer-finish "uniffi_moq_ffi_checksum_method_moqtrackproducer_finish" [] :uint16) | ||
| 225 | +(ffi/defcfn checksum-method-moqtrackproducer-finish-at "uniffi_moq_ffi_checksum_method_moqtrackproducer_finish_at" [] :uint16) | ||
| 226 | +(ffi/defcfn checksum-method-moqtrackproducer-name "uniffi_moq_ffi_checksum_method_moqtrackproducer_name" [] :uint16) | ||
| 227 | +(ffi/defcfn checksum-method-moqtrackproducer-unused "uniffi_moq_ffi_checksum_method_moqtrackproducer_unused" [] :uint16) | ||
| 228 | +(ffi/defcfn checksum-method-moqtrackproducer-used "uniffi_moq_ffi_checksum_method_moqtrackproducer_used" [] :uint16) | ||
| 229 | +(ffi/defcfn checksum-method-moqtrackproducer-write-frame "uniffi_moq_ffi_checksum_method_moqtrackproducer_write_frame" [] :uint16) | ||
| 230 | +(ffi/defcfn checksum-method-moqtrackrequest-abort "uniffi_moq_ffi_checksum_method_moqtrackrequest_abort" [] :uint16) | ||
| 231 | +(ffi/defcfn checksum-method-moqtrackrequest-accept "uniffi_moq_ffi_checksum_method_moqtrackrequest_accept" [] :uint16) | ||
| 232 | +(ffi/defcfn checksum-method-moqtrackrequest-dynamic "uniffi_moq_ffi_checksum_method_moqtrackrequest_dynamic" [] :uint16) | ||
| 233 | +(ffi/defcfn checksum-method-moqtrackrequest-name "uniffi_moq_ffi_checksum_method_moqtrackrequest_name" [] :uint16) | ||
| 234 | +(ffi/defcfn clone-moqannounced "uniffi_moq_ffi_fn_clone_moqannounced" [:uint64 :pointer] :uint64) | ||
| 235 | +(ffi/defcfn clone-moqannouncedbroadcast "uniffi_moq_ffi_fn_clone_moqannouncedbroadcast" [:uint64 :pointer] :uint64) | ||
| 236 | +(ffi/defcfn clone-moqannouncement "uniffi_moq_ffi_fn_clone_moqannouncement" [:uint64 :pointer] :uint64) | ||
| 237 | +(ffi/defcfn clone-moqbroadcastconsumer "uniffi_moq_ffi_fn_clone_moqbroadcastconsumer" [:uint64 :pointer] :uint64) | ||
| 238 | +(ffi/defcfn clone-moqbroadcastdynamic "uniffi_moq_ffi_fn_clone_moqbroadcastdynamic" [:uint64 :pointer] :uint64) | ||
| 239 | +(ffi/defcfn clone-moqbroadcastproducer "uniffi_moq_ffi_fn_clone_moqbroadcastproducer" [:uint64 :pointer] :uint64) | ||
| 240 | +(ffi/defcfn clone-moqbroadcastrequest "uniffi_moq_ffi_fn_clone_moqbroadcastrequest" [:uint64 :pointer] :uint64) | ||
| 241 | +(ffi/defcfn clone-moqcatalogconsumer "uniffi_moq_ffi_fn_clone_moqcatalogconsumer" [:uint64 :pointer] :uint64) | ||
| 242 | +(ffi/defcfn clone-moqclient "uniffi_moq_ffi_fn_clone_moqclient" [:uint64 :pointer] :uint64) | ||
| 243 | +(ffi/defcfn clone-moqgroupconsumer "uniffi_moq_ffi_fn_clone_moqgroupconsumer" [:uint64 :pointer] :uint64) | ||
| 244 | +(ffi/defcfn clone-moqgroupproducer "uniffi_moq_ffi_fn_clone_moqgroupproducer" [:uint64 :pointer] :uint64) | ||
| 245 | +(ffi/defcfn clone-moqgrouprequest "uniffi_moq_ffi_fn_clone_moqgrouprequest" [:uint64 :pointer] :uint64) | ||
| 246 | +(ffi/defcfn clone-moqjsonsnapshotconsumer "uniffi_moq_ffi_fn_clone_moqjsonsnapshotconsumer" [:uint64 :pointer] :uint64) | ||
| 247 | +(ffi/defcfn clone-moqjsonsnapshotproducer "uniffi_moq_ffi_fn_clone_moqjsonsnapshotproducer" [:uint64 :pointer] :uint64) | ||
| 248 | +(ffi/defcfn clone-moqjsonstreamconsumer "uniffi_moq_ffi_fn_clone_moqjsonstreamconsumer" [:uint64 :pointer] :uint64) | ||
| 249 | +(ffi/defcfn clone-moqjsonstreamproducer "uniffi_moq_ffi_fn_clone_moqjsonstreamproducer" [:uint64 :pointer] :uint64) | ||
| 250 | +(ffi/defcfn clone-moqmediaconsumer "uniffi_moq_ffi_fn_clone_moqmediaconsumer" [:uint64 :pointer] :uint64) | ||
| 251 | +(ffi/defcfn clone-moqmediagroupconsumer "uniffi_moq_ffi_fn_clone_moqmediagroupconsumer" [:uint64 :pointer] :uint64) | ||
| 252 | +(ffi/defcfn clone-moqmediaproducer "uniffi_moq_ffi_fn_clone_moqmediaproducer" [:uint64 :pointer] :uint64) | ||
| 253 | +(ffi/defcfn clone-moqmediastreamproducer "uniffi_moq_ffi_fn_clone_moqmediastreamproducer" [:uint64 :pointer] :uint64) | ||
| 254 | +(ffi/defcfn clone-moqoriginconsumer "uniffi_moq_ffi_fn_clone_moqoriginconsumer" [:uint64 :pointer] :uint64) | ||
| 255 | +(ffi/defcfn clone-moqorigindynamic "uniffi_moq_ffi_fn_clone_moqorigindynamic" [:uint64 :pointer] :uint64) | ||
| 256 | +(ffi/defcfn clone-moqoriginproducer "uniffi_moq_ffi_fn_clone_moqoriginproducer" [:uint64 :pointer] :uint64) | ||
| 257 | +(ffi/defcfn clone-moqrequest "uniffi_moq_ffi_fn_clone_moqrequest" [:uint64 :pointer] :uint64) | ||
| 258 | +(ffi/defcfn clone-moqroutewatch "uniffi_moq_ffi_fn_clone_moqroutewatch" [:uint64 :pointer] :uint64) | ||
| 259 | +(ffi/defcfn clone-moqserver "uniffi_moq_ffi_fn_clone_moqserver" [:uint64 :pointer] :uint64) | ||
| 260 | +(ffi/defcfn clone-moqsession "uniffi_moq_ffi_fn_clone_moqsession" [:uint64 :pointer] :uint64) | ||
| 261 | +(ffi/defcfn clone-moqtrackconsumer "uniffi_moq_ffi_fn_clone_moqtrackconsumer" [:uint64 :pointer] :uint64) | ||
| 262 | +(ffi/defcfn clone-moqtrackdynamic "uniffi_moq_ffi_fn_clone_moqtrackdynamic" [:uint64 :pointer] :uint64) | ||
| 263 | +(ffi/defcfn clone-moqtrackproducer "uniffi_moq_ffi_fn_clone_moqtrackproducer" [:uint64 :pointer] :uint64) | ||
| 264 | +(ffi/defcfn clone-moqtrackrequest "uniffi_moq_ffi_fn_clone_moqtrackrequest" [:uint64 :pointer] :uint64) | ||
| 265 | +(ffi/defcfn constructor-moqbroadcastproducer-new "uniffi_moq_ffi_fn_constructor_moqbroadcastproducer_new" [:pointer] :uint64) | ||
| 266 | +(ffi/defcfn constructor-moqclient-new "uniffi_moq_ffi_fn_constructor_moqclient_new" [:pointer] :uint64) | ||
| 267 | +(ffi/defcfn constructor-moqoriginproducer-new "uniffi_moq_ffi_fn_constructor_moqoriginproducer_new" [[:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :uint64) | ||
| 268 | +(ffi/defcfn constructor-moqserver-new "uniffi_moq_ffi_fn_constructor_moqserver_new" [:pointer] :uint64) | ||
| 269 | +(ffi/defcfn free-moqannounced "uniffi_moq_ffi_fn_free_moqannounced" [:uint64 :pointer] :void) | ||
| 270 | +(ffi/defcfn free-moqannouncedbroadcast "uniffi_moq_ffi_fn_free_moqannouncedbroadcast" [:uint64 :pointer] :void) | ||
| 271 | +(ffi/defcfn free-moqannouncement "uniffi_moq_ffi_fn_free_moqannouncement" [:uint64 :pointer] :void) | ||
| 272 | +(ffi/defcfn free-moqbroadcastconsumer "uniffi_moq_ffi_fn_free_moqbroadcastconsumer" [:uint64 :pointer] :void) | ||
| 273 | +(ffi/defcfn free-moqbroadcastdynamic "uniffi_moq_ffi_fn_free_moqbroadcastdynamic" [:uint64 :pointer] :void) | ||
| 274 | +(ffi/defcfn free-moqbroadcastproducer "uniffi_moq_ffi_fn_free_moqbroadcastproducer" [:uint64 :pointer] :void) | ||
| 275 | +(ffi/defcfn free-moqbroadcastrequest "uniffi_moq_ffi_fn_free_moqbroadcastrequest" [:uint64 :pointer] :void) | ||
| 276 | +(ffi/defcfn free-moqcatalogconsumer "uniffi_moq_ffi_fn_free_moqcatalogconsumer" [:uint64 :pointer] :void) | ||
| 277 | +(ffi/defcfn free-moqclient "uniffi_moq_ffi_fn_free_moqclient" [:uint64 :pointer] :void) | ||
| 278 | +(ffi/defcfn free-moqgroupconsumer "uniffi_moq_ffi_fn_free_moqgroupconsumer" [:uint64 :pointer] :void) | ||
| 279 | +(ffi/defcfn free-moqgroupproducer "uniffi_moq_ffi_fn_free_moqgroupproducer" [:uint64 :pointer] :void) | ||
| 280 | +(ffi/defcfn free-moqgrouprequest "uniffi_moq_ffi_fn_free_moqgrouprequest" [:uint64 :pointer] :void) | ||
| 281 | +(ffi/defcfn free-moqjsonsnapshotconsumer "uniffi_moq_ffi_fn_free_moqjsonsnapshotconsumer" [:uint64 :pointer] :void) | ||
| 282 | +(ffi/defcfn free-moqjsonsnapshotproducer "uniffi_moq_ffi_fn_free_moqjsonsnapshotproducer" [:uint64 :pointer] :void) | ||
| 283 | +(ffi/defcfn free-moqjsonstreamconsumer "uniffi_moq_ffi_fn_free_moqjsonstreamconsumer" [:uint64 :pointer] :void) | ||
| 284 | +(ffi/defcfn free-moqjsonstreamproducer "uniffi_moq_ffi_fn_free_moqjsonstreamproducer" [:uint64 :pointer] :void) | ||
| 285 | +(ffi/defcfn free-moqmediaconsumer "uniffi_moq_ffi_fn_free_moqmediaconsumer" [:uint64 :pointer] :void) | ||
| 286 | +(ffi/defcfn free-moqmediagroupconsumer "uniffi_moq_ffi_fn_free_moqmediagroupconsumer" [:uint64 :pointer] :void) | ||
| 287 | +(ffi/defcfn free-moqmediaproducer "uniffi_moq_ffi_fn_free_moqmediaproducer" [:uint64 :pointer] :void) | ||
| 288 | +(ffi/defcfn free-moqmediastreamproducer "uniffi_moq_ffi_fn_free_moqmediastreamproducer" [:uint64 :pointer] :void) | ||
| 289 | +(ffi/defcfn free-moqoriginconsumer "uniffi_moq_ffi_fn_free_moqoriginconsumer" [:uint64 :pointer] :void) | ||
| 290 | +(ffi/defcfn free-moqorigindynamic "uniffi_moq_ffi_fn_free_moqorigindynamic" [:uint64 :pointer] :void) | ||
| 291 | +(ffi/defcfn free-moqoriginproducer "uniffi_moq_ffi_fn_free_moqoriginproducer" [:uint64 :pointer] :void) | ||
| 292 | +(ffi/defcfn free-moqrequest "uniffi_moq_ffi_fn_free_moqrequest" [:uint64 :pointer] :void) | ||
| 293 | +(ffi/defcfn free-moqroutewatch "uniffi_moq_ffi_fn_free_moqroutewatch" [:uint64 :pointer] :void) | ||
| 294 | +(ffi/defcfn free-moqserver "uniffi_moq_ffi_fn_free_moqserver" [:uint64 :pointer] :void) | ||
| 295 | +(ffi/defcfn free-moqsession "uniffi_moq_ffi_fn_free_moqsession" [:uint64 :pointer] :void) | ||
| 296 | +(ffi/defcfn free-moqtrackconsumer "uniffi_moq_ffi_fn_free_moqtrackconsumer" [:uint64 :pointer] :void) | ||
| 297 | +(ffi/defcfn free-moqtrackdynamic "uniffi_moq_ffi_fn_free_moqtrackdynamic" [:uint64 :pointer] :void) | ||
| 298 | +(ffi/defcfn free-moqtrackproducer "uniffi_moq_ffi_fn_free_moqtrackproducer" [:uint64 :pointer] :void) | ||
| 299 | +(ffi/defcfn free-moqtrackrequest "uniffi_moq_ffi_fn_free_moqtrackrequest" [:uint64 :pointer] :void) | ||
| 300 | +(ffi/defcfn func-moq-log-level "uniffi_moq_ffi_fn_func_moq_log_level" [[:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | ||
| 301 | +(ffi/defcfn method-moqannounced-cancel "uniffi_moq_ffi_fn_method_moqannounced_cancel" [:uint64 :pointer] :void) | ||
| 302 | +(ffi/defcfn method-moqannounced-next "uniffi_moq_ffi_fn_method_moqannounced_next" [:uint64] :uint64) | ||
| 303 | +(ffi/defcfn method-moqannouncedbroadcast-available "uniffi_moq_ffi_fn_method_moqannouncedbroadcast_available" [:uint64] :uint64) | ||
| 304 | +(ffi/defcfn method-moqannouncedbroadcast-cancel "uniffi_moq_ffi_fn_method_moqannouncedbroadcast_cancel" [:uint64 :pointer] :void) | ||
| 305 | +(ffi/defcfn method-moqannouncement-broadcast "uniffi_moq_ffi_fn_method_moqannouncement_broadcast" [:uint64 :pointer] :uint64) | ||
| 306 | +(ffi/defcfn method-moqannouncement-path "uniffi_moq_ffi_fn_method_moqannouncement_path" [:uint64 :pointer] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]) | ||
| 307 | +(ffi/defcfn method-moqbroadcastconsumer-fetch-group "uniffi_moq_ffi_fn_method_moqbroadcastconsumer_fetch_group" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]] :uint64) | ||
| 308 | +(ffi/defcfn method-moqbroadcastconsumer-fetch-media-group "uniffi_moq_ffi_fn_method_moqbroadcastconsumer_fetch_media_group" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]] :uint64) | ||
| 309 | +(ffi/defcfn method-moqbroadcastconsumer-route "uniffi_moq_ffi_fn_method_moqbroadcastconsumer_route" [:uint64 :pointer] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]) | ||
| 310 | +(ffi/defcfn method-moqbroadcastconsumer-route-updates "uniffi_moq_ffi_fn_method_moqbroadcastconsumer_route_updates" [:uint64 :pointer] :uint64) | ||
| 311 | +(ffi/defcfn method-moqbroadcastconsumer-subscribe-catalog "uniffi_moq_ffi_fn_method_moqbroadcastconsumer_subscribe_catalog" [:uint64] :uint64) | ||
| 312 | +(ffi/defcfn method-moqbroadcastconsumer-subscribe-json-snapshot "uniffi_moq_ffi_fn_method_moqbroadcastconsumer_subscribe_json_snapshot" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]] :uint64) | ||
| 313 | +(ffi/defcfn method-moqbroadcastconsumer-subscribe-json-stream "uniffi_moq_ffi_fn_method_moqbroadcastconsumer_subscribe_json_stream" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]] :uint64) | ||
| 314 | +(ffi/defcfn method-moqbroadcastconsumer-subscribe-media "uniffi_moq_ffi_fn_method_moqbroadcastconsumer_subscribe_media" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]] :uint64) | ||
| 315 | +(ffi/defcfn method-moqbroadcastconsumer-subscribe-track "uniffi_moq_ffi_fn_method_moqbroadcastconsumer_subscribe_track" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]] :uint64) | ||
| 316 | +(ffi/defcfn method-moqbroadcastdynamic-cancel "uniffi_moq_ffi_fn_method_moqbroadcastdynamic_cancel" [:uint64 :pointer] :void) | ||
| 317 | +(ffi/defcfn method-moqbroadcastdynamic-requested-track "uniffi_moq_ffi_fn_method_moqbroadcastdynamic_requested_track" [:uint64] :uint64) | ||
| 318 | +(ffi/defcfn method-moqbroadcastproducer-consume "uniffi_moq_ffi_fn_method_moqbroadcastproducer_consume" [:uint64 :pointer] :uint64) | ||
| 319 | +(ffi/defcfn method-moqbroadcastproducer-dynamic "uniffi_moq_ffi_fn_method_moqbroadcastproducer_dynamic" [:uint64 :pointer] :uint64) | ||
| 320 | +(ffi/defcfn method-moqbroadcastproducer-finish "uniffi_moq_ffi_fn_method_moqbroadcastproducer_finish" [:uint64 :pointer] :void) | ||
| 321 | +(ffi/defcfn method-moqbroadcastproducer-publish-json-snapshot "uniffi_moq_ffi_fn_method_moqbroadcastproducer_publish_json_snapshot" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :uint64) | ||
| 322 | +(ffi/defcfn method-moqbroadcastproducer-publish-json-stream "uniffi_moq_ffi_fn_method_moqbroadcastproducer_publish_json_stream" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :uint64) | ||
| 323 | +(ffi/defcfn method-moqbroadcastproducer-publish-media "uniffi_moq_ffi_fn_method_moqbroadcastproducer_publish_media" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :uint64) | ||
| 324 | +(ffi/defcfn method-moqbroadcastproducer-publish-media-on-track "uniffi_moq_ffi_fn_method_moqbroadcastproducer_publish_media_on_track" [:uint64 :uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :uint64) | ||
| 325 | +(ffi/defcfn method-moqbroadcastproducer-publish-media-stream "uniffi_moq_ffi_fn_method_moqbroadcastproducer_publish_media_stream" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :uint64) | ||
| 326 | +(ffi/defcfn method-moqbroadcastproducer-publish-track "uniffi_moq_ffi_fn_method_moqbroadcastproducer_publish_track" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :uint64) | ||
| 327 | +(ffi/defcfn method-moqbroadcastproducer-remove-catalog-section "uniffi_moq_ffi_fn_method_moqbroadcastproducer_remove_catalog_section" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | ||
| 328 | +(ffi/defcfn method-moqbroadcastproducer-set-announce "uniffi_moq_ffi_fn_method_moqbroadcastproducer_set_announce" [:uint64 :int8 :pointer] :void) | ||
| 329 | +(ffi/defcfn method-moqbroadcastproducer-set-catalog-section "uniffi_moq_ffi_fn_method_moqbroadcastproducer_set_catalog_section" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | ||
| 330 | +(ffi/defcfn method-moqbroadcastproducer-set-route "uniffi_moq_ffi_fn_method_moqbroadcastproducer_set_route" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | ||
| 331 | +(ffi/defcfn method-moqbroadcastproducer-set-video-properties "uniffi_moq_ffi_fn_method_moqbroadcastproducer_set_video_properties" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | ||
| 332 | +(ffi/defcfn method-moqbroadcastrequest-abort "uniffi_moq_ffi_fn_method_moqbroadcastrequest_abort" [:uint64 :uint16 :pointer] :void) | ||
| 333 | +(ffi/defcfn method-moqbroadcastrequest-accept "uniffi_moq_ffi_fn_method_moqbroadcastrequest_accept" [:uint64 :uint64 :pointer] :void) | ||
| 334 | +(ffi/defcfn method-moqbroadcastrequest-path "uniffi_moq_ffi_fn_method_moqbroadcastrequest_path" [:uint64 :pointer] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]) | ||
| 335 | +(ffi/defcfn method-moqcatalogconsumer-cancel "uniffi_moq_ffi_fn_method_moqcatalogconsumer_cancel" [:uint64 :pointer] :void) | ||
| 336 | +(ffi/defcfn method-moqcatalogconsumer-next "uniffi_moq_ffi_fn_method_moqcatalogconsumer_next" [:uint64] :uint64) | ||
| 337 | +(ffi/defcfn method-moqclient-cancel "uniffi_moq_ffi_fn_method_moqclient_cancel" [:uint64 :pointer] :void) | ||
| 338 | +(ffi/defcfn method-moqclient-connect "uniffi_moq_ffi_fn_method_moqclient_connect" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]] :uint64) | ||
| 339 | +(ffi/defcfn method-moqclient-set-bind "uniffi_moq_ffi_fn_method_moqclient_set_bind" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | ||
| 340 | +(ffi/defcfn method-moqclient-set-consume "uniffi_moq_ffi_fn_method_moqclient_set_consume" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | ||
| 341 | +(ffi/defcfn method-moqclient-set-publish "uniffi_moq_ffi_fn_method_moqclient_set_publish" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | ||
| 342 | +(ffi/defcfn method-moqclient-set-tls-cert "uniffi_moq_ffi_fn_method_moqclient_set_tls_cert" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | ||
| 343 | +(ffi/defcfn method-moqclient-set-tls-disable-verify "uniffi_moq_ffi_fn_method_moqclient_set_tls_disable_verify" [:uint64 :int8 :pointer] :void) | ||
| 344 | +(ffi/defcfn method-moqclient-set-tls-fingerprints "uniffi_moq_ffi_fn_method_moqclient_set_tls_fingerprints" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | ||
| 345 | +(ffi/defcfn method-moqclient-set-tls-key "uniffi_moq_ffi_fn_method_moqclient_set_tls_key" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | ||
| 346 | +(ffi/defcfn method-moqclient-set-tls-roots "uniffi_moq_ffi_fn_method_moqclient_set_tls_roots" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | ||
| 347 | +(ffi/defcfn method-moqclient-set-tls-system-roots "uniffi_moq_ffi_fn_method_moqclient_set_tls_system_roots" [:uint64 :int8 :pointer] :void) | ||
| 348 | +(ffi/defcfn method-moqgroupconsumer-cancel "uniffi_moq_ffi_fn_method_moqgroupconsumer_cancel" [:uint64 :pointer] :void) | ||
| 349 | +(ffi/defcfn method-moqgroupconsumer-read-frame "uniffi_moq_ffi_fn_method_moqgroupconsumer_read_frame" [:uint64] :uint64) | ||
| 350 | +(ffi/defcfn method-moqgroupconsumer-sequence "uniffi_moq_ffi_fn_method_moqgroupconsumer_sequence" [:uint64 :pointer] :uint64) | ||
| 351 | +(ffi/defcfn method-moqgroupproducer-abort "uniffi_moq_ffi_fn_method_moqgroupproducer_abort" [:uint64 :uint16 :pointer] :void) | ||
| 352 | +(ffi/defcfn method-moqgroupproducer-consume "uniffi_moq_ffi_fn_method_moqgroupproducer_consume" [:uint64 :pointer] :uint64) | ||
| 353 | +(ffi/defcfn method-moqgroupproducer-finish "uniffi_moq_ffi_fn_method_moqgroupproducer_finish" [:uint64 :pointer] :void) | ||
| 354 | +(ffi/defcfn method-moqgroupproducer-sequence "uniffi_moq_ffi_fn_method_moqgroupproducer_sequence" [:uint64 :pointer] :uint64) | ||
| 355 | +(ffi/defcfn method-moqgroupproducer-write-frame "uniffi_moq_ffi_fn_method_moqgroupproducer_write_frame" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | ||
| 356 | +(ffi/defcfn method-moqgrouprequest-abort "uniffi_moq_ffi_fn_method_moqgrouprequest_abort" [:uint64 :uint16 :pointer] :void) | ||
| 357 | +(ffi/defcfn method-moqgrouprequest-accept "uniffi_moq_ffi_fn_method_moqgrouprequest_accept" [:uint64 :pointer] :uint64) | ||
| 358 | +(ffi/defcfn method-moqgrouprequest-priority "uniffi_moq_ffi_fn_method_moqgrouprequest_priority" [:uint64 :pointer] :uint8) | ||
| 359 | +(ffi/defcfn method-moqgrouprequest-sequence "uniffi_moq_ffi_fn_method_moqgrouprequest_sequence" [:uint64 :pointer] :uint64) | ||
| 360 | +(ffi/defcfn method-moqjsonsnapshotconsumer-cancel "uniffi_moq_ffi_fn_method_moqjsonsnapshotconsumer_cancel" [:uint64 :pointer] :void) | ||
| 361 | +(ffi/defcfn method-moqjsonsnapshotconsumer-next "uniffi_moq_ffi_fn_method_moqjsonsnapshotconsumer_next" [:uint64] :uint64) | ||
| 362 | +(ffi/defcfn method-moqjsonsnapshotproducer-finish "uniffi_moq_ffi_fn_method_moqjsonsnapshotproducer_finish" [:uint64 :pointer] :void) | ||
| 363 | +(ffi/defcfn method-moqjsonsnapshotproducer-update "uniffi_moq_ffi_fn_method_moqjsonsnapshotproducer_update" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | ||
| 364 | +(ffi/defcfn method-moqjsonstreamconsumer-cancel "uniffi_moq_ffi_fn_method_moqjsonstreamconsumer_cancel" [:uint64 :pointer] :void) | ||
| 365 | +(ffi/defcfn method-moqjsonstreamconsumer-next "uniffi_moq_ffi_fn_method_moqjsonstreamconsumer_next" [:uint64] :uint64) | ||
| 366 | +(ffi/defcfn method-moqjsonstreamproducer-append "uniffi_moq_ffi_fn_method_moqjsonstreamproducer_append" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | ||
| 367 | +(ffi/defcfn method-moqjsonstreamproducer-finish "uniffi_moq_ffi_fn_method_moqjsonstreamproducer_finish" [:uint64 :pointer] :void) | ||
| 368 | +(ffi/defcfn method-moqmediaconsumer-cancel "uniffi_moq_ffi_fn_method_moqmediaconsumer_cancel" [:uint64 :pointer] :void) | ||
| 369 | +(ffi/defcfn method-moqmediaconsumer-next "uniffi_moq_ffi_fn_method_moqmediaconsumer_next" [:uint64] :uint64) | ||
| 370 | +(ffi/defcfn method-moqmediagroupconsumer-cancel "uniffi_moq_ffi_fn_method_moqmediagroupconsumer_cancel" [:uint64 :pointer] :void) | ||
| 371 | +(ffi/defcfn method-moqmediagroupconsumer-next "uniffi_moq_ffi_fn_method_moqmediagroupconsumer_next" [:uint64] :uint64) | ||
| 372 | +(ffi/defcfn method-moqmediagroupconsumer-sequence "uniffi_moq_ffi_fn_method_moqmediagroupconsumer_sequence" [:uint64 :pointer] :uint64) | ||
| 373 | +(ffi/defcfn method-moqmediaproducer-finish "uniffi_moq_ffi_fn_method_moqmediaproducer_finish" [:uint64 :pointer] :void) | ||
| 374 | +(ffi/defcfn method-moqmediaproducer-name "uniffi_moq_ffi_fn_method_moqmediaproducer_name" [:uint64 :pointer] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]) | ||
| 375 | +(ffi/defcfn method-moqmediaproducer-unused "uniffi_moq_ffi_fn_method_moqmediaproducer_unused" [:uint64] :uint64) | ||
| 376 | +(ffi/defcfn method-moqmediaproducer-used "uniffi_moq_ffi_fn_method_moqmediaproducer_used" [:uint64] :uint64) | ||
| 377 | +(ffi/defcfn method-moqmediaproducer-write-frame "uniffi_moq_ffi_fn_method_moqmediaproducer_write_frame" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | ||
| 378 | +(ffi/defcfn method-moqmediastreamproducer-finish "uniffi_moq_ffi_fn_method_moqmediastreamproducer_finish" [:uint64 :pointer] :void) | ||
| 379 | +(ffi/defcfn method-moqmediastreamproducer-write "uniffi_moq_ffi_fn_method_moqmediastreamproducer_write" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | ||
| 380 | +(ffi/defcfn method-moqoriginconsumer-announced "uniffi_moq_ffi_fn_method_moqoriginconsumer_announced" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :uint64) | ||
| 381 | +(ffi/defcfn method-moqoriginconsumer-announced-broadcast "uniffi_moq_ffi_fn_method_moqoriginconsumer_announced_broadcast" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :uint64) | ||
| 382 | +(ffi/defcfn method-moqoriginconsumer-request-broadcast "uniffi_moq_ffi_fn_method_moqoriginconsumer_request_broadcast" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]] :uint64) | ||
| 383 | +(ffi/defcfn method-moqorigindynamic-cancel "uniffi_moq_ffi_fn_method_moqorigindynamic_cancel" [:uint64 :pointer] :void) | ||
| 384 | +(ffi/defcfn method-moqorigindynamic-requested-broadcast "uniffi_moq_ffi_fn_method_moqorigindynamic_requested_broadcast" [:uint64] :uint64) | ||
| 385 | +(ffi/defcfn method-moqoriginproducer-consume "uniffi_moq_ffi_fn_method_moqoriginproducer_consume" [:uint64 :pointer] :uint64) | ||
| 386 | +(ffi/defcfn method-moqoriginproducer-create-broadcast "uniffi_moq_ffi_fn_method_moqoriginproducer_create_broadcast" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :uint64) | ||
| 387 | +(ffi/defcfn method-moqoriginproducer-dynamic "uniffi_moq_ffi_fn_method_moqoriginproducer_dynamic" [:uint64 :pointer] :uint64) | ||
| 388 | +(ffi/defcfn method-moqrequest-accept "uniffi_moq_ffi_fn_method_moqrequest_accept" [:uint64] :uint64) | ||
| 389 | +(ffi/defcfn method-moqrequest-cancel "uniffi_moq_ffi_fn_method_moqrequest_cancel" [:uint64 :pointer] :void) | ||
| 390 | +(ffi/defcfn method-moqrequest-path "uniffi_moq_ffi_fn_method_moqrequest_path" [:uint64 :pointer] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]) | ||
| 391 | +(ffi/defcfn method-moqrequest-query "uniffi_moq_ffi_fn_method_moqrequest_query" [:uint64 :pointer] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]) | ||
| 392 | +(ffi/defcfn method-moqrequest-reject "uniffi_moq_ffi_fn_method_moqrequest_reject" [:uint64 :uint16] :uint64) | ||
| 393 | +(ffi/defcfn method-moqrequest-set-consume "uniffi_moq_ffi_fn_method_moqrequest_set_consume" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | ||
| 394 | +(ffi/defcfn method-moqrequest-set-publish "uniffi_moq_ffi_fn_method_moqrequest_set_publish" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | ||
| 395 | +(ffi/defcfn method-moqrequest-transport "uniffi_moq_ffi_fn_method_moqrequest_transport" [:uint64 :pointer] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]) | ||
| 396 | +(ffi/defcfn method-moqrequest-url "uniffi_moq_ffi_fn_method_moqrequest_url" [:uint64 :pointer] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]) | ||
| 397 | +(ffi/defcfn method-moqroutewatch-cancel "uniffi_moq_ffi_fn_method_moqroutewatch_cancel" [:uint64 :pointer] :void) | ||
| 398 | +(ffi/defcfn method-moqroutewatch-next "uniffi_moq_ffi_fn_method_moqroutewatch_next" [:uint64] :uint64) | ||
| 399 | +(ffi/defcfn method-moqserver-accept "uniffi_moq_ffi_fn_method_moqserver_accept" [:uint64] :uint64) | ||
| 400 | +(ffi/defcfn method-moqserver-cancel "uniffi_moq_ffi_fn_method_moqserver_cancel" [:uint64 :pointer] :void) | ||
| 401 | +(ffi/defcfn method-moqserver-cert-fingerprints "uniffi_moq_ffi_fn_method_moqserver_cert_fingerprints" [:uint64 :pointer] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]) | ||
| 402 | +(ffi/defcfn method-moqserver-listen "uniffi_moq_ffi_fn_method_moqserver_listen" [:uint64] :uint64) | ||
| 403 | +(ffi/defcfn method-moqserver-set-bind "uniffi_moq_ffi_fn_method_moqserver_set_bind" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | ||
| 404 | +(ffi/defcfn method-moqserver-set-consume "uniffi_moq_ffi_fn_method_moqserver_set_consume" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | ||
| 405 | +(ffi/defcfn method-moqserver-set-publish "uniffi_moq_ffi_fn_method_moqserver_set_publish" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | ||
| 406 | +(ffi/defcfn method-moqserver-set-tls-cert "uniffi_moq_ffi_fn_method_moqserver_set_tls_cert" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | ||
| 407 | +(ffi/defcfn method-moqserver-set-tls-generate "uniffi_moq_ffi_fn_method_moqserver_set_tls_generate" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | ||
| 408 | +(ffi/defcfn method-moqserver-set-tls-key "uniffi_moq_ffi_fn_method_moqserver_set_tls_key" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | ||
| 409 | +(ffi/defcfn method-moqsession-cancel "uniffi_moq_ffi_fn_method_moqsession_cancel" [:uint64 :uint32 :pointer] :void) | ||
| 410 | +(ffi/defcfn method-moqsession-closed "uniffi_moq_ffi_fn_method_moqsession_closed" [:uint64] :uint64) | ||
| 411 | +(ffi/defcfn method-moqsession-consumer "uniffi_moq_ffi_fn_method_moqsession_consumer" [:uint64 :pointer] :uint64) | ||
| 412 | +(ffi/defcfn method-moqsession-publisher "uniffi_moq_ffi_fn_method_moqsession_publisher" [:uint64 :pointer] :uint64) | ||
| 413 | +(ffi/defcfn method-moqsession-shutdown "uniffi_moq_ffi_fn_method_moqsession_shutdown" [:uint64 :pointer] :void) | ||
| 414 | +(ffi/defcfn method-moqsession-stats "uniffi_moq_ffi_fn_method_moqsession_stats" [:uint64 :pointer] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]) | ||
| 415 | +(ffi/defcfn method-moqtrackconsumer-cancel "uniffi_moq_ffi_fn_method_moqtrackconsumer_cancel" [:uint64 :pointer] :void) | ||
| 416 | +(ffi/defcfn method-moqtrackconsumer-info "uniffi_moq_ffi_fn_method_moqtrackconsumer_info" [:uint64 :pointer] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]) | ||
| 417 | +(ffi/defcfn method-moqtrackconsumer-next-group "uniffi_moq_ffi_fn_method_moqtrackconsumer_next_group" [:uint64] :uint64) | ||
| 418 | +(ffi/defcfn method-moqtrackconsumer-read-frame "uniffi_moq_ffi_fn_method_moqtrackconsumer_read_frame" [:uint64] :uint64) | ||
| 419 | +(ffi/defcfn method-moqtrackconsumer-recv-datagram "uniffi_moq_ffi_fn_method_moqtrackconsumer_recv_datagram" [:uint64] :uint64) | ||
| 420 | +(ffi/defcfn method-moqtrackconsumer-recv-group "uniffi_moq_ffi_fn_method_moqtrackconsumer_recv_group" [:uint64] :uint64) | ||
| 421 | +(ffi/defcfn method-moqtrackconsumer-update "uniffi_moq_ffi_fn_method_moqtrackconsumer_update" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | ||
| 422 | +(ffi/defcfn method-moqtrackdynamic-cancel "uniffi_moq_ffi_fn_method_moqtrackdynamic_cancel" [:uint64 :pointer] :void) | ||
| 423 | +(ffi/defcfn method-moqtrackdynamic-requested-group "uniffi_moq_ffi_fn_method_moqtrackdynamic_requested_group" [:uint64] :uint64) | ||
| 424 | +(ffi/defcfn method-moqtrackproducer-abort "uniffi_moq_ffi_fn_method_moqtrackproducer_abort" [:uint64 :uint16 :pointer] :void) | ||
| 425 | +(ffi/defcfn method-moqtrackproducer-append-datagram "uniffi_moq_ffi_fn_method_moqtrackproducer_append_datagram" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :uint64) | ||
| 426 | +(ffi/defcfn method-moqtrackproducer-append-group "uniffi_moq_ffi_fn_method_moqtrackproducer_append_group" [:uint64 :pointer] :uint64) | ||
| 427 | +(ffi/defcfn method-moqtrackproducer-consume "uniffi_moq_ffi_fn_method_moqtrackproducer_consume" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :uint64) | ||
| 428 | +(ffi/defcfn method-moqtrackproducer-create-group "uniffi_moq_ffi_fn_method_moqtrackproducer_create_group" [:uint64 :uint64 :pointer] :uint64) | ||
| 429 | +(ffi/defcfn method-moqtrackproducer-dynamic "uniffi_moq_ffi_fn_method_moqtrackproducer_dynamic" [:uint64 :pointer] :uint64) | ||
| 430 | +(ffi/defcfn method-moqtrackproducer-finish "uniffi_moq_ffi_fn_method_moqtrackproducer_finish" [:uint64 :pointer] :void) | ||
| 431 | +(ffi/defcfn method-moqtrackproducer-finish-at "uniffi_moq_ffi_fn_method_moqtrackproducer_finish_at" [:uint64 :uint64 :pointer] :void) | ||
| 432 | +(ffi/defcfn method-moqtrackproducer-name "uniffi_moq_ffi_fn_method_moqtrackproducer_name" [:uint64 :pointer] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]) | ||
| 433 | +(ffi/defcfn method-moqtrackproducer-unused "uniffi_moq_ffi_fn_method_moqtrackproducer_unused" [:uint64] :uint64) | ||
| 434 | +(ffi/defcfn method-moqtrackproducer-used "uniffi_moq_ffi_fn_method_moqtrackproducer_used" [:uint64] :uint64) | ||
| 435 | +(ffi/defcfn method-moqtrackproducer-write-frame "uniffi_moq_ffi_fn_method_moqtrackproducer_write_frame" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :void) | ||
| 436 | +(ffi/defcfn method-moqtrackrequest-abort "uniffi_moq_ffi_fn_method_moqtrackrequest_abort" [:uint64 :uint16 :pointer] :void) | ||
| 437 | +(ffi/defcfn method-moqtrackrequest-accept "uniffi_moq_ffi_fn_method_moqtrackrequest_accept" [:uint64 [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]] :pointer] :uint64) | ||
| 438 | +(ffi/defcfn method-moqtrackrequest-dynamic "uniffi_moq_ffi_fn_method_moqtrackrequest_dynamic" [:uint64 :pointer] :uint64) | ||
| 439 | +(ffi/defcfn method-moqtrackrequest-name "uniffi_moq_ffi_fn_method_moqtrackrequest_name" [:uint64 :pointer] [:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]) | ||
added
src/frq/moq/smoke.clj +74 -0 | new file mode 100644 | ||
| @@ -0,0 +1,74 @@ | ||
| 1 | +(ns frq.moq.smoke | |
| 2 | + "The smallest round trip that proves the generated bindings are real. | |
| 3 | + | |
| 4 | + Nothing in `frq.moq.*` has crossed the ABI until something does, and the | |
| 5 | + failure modes here are not the kind that announce themselves: a RustBuffer | |
| 6 | + whose fields are the wrong width reads as plausible garbage, and a handle | |
| 7 | + freed twice corrupts an allocator some minutes later rather than at the call. | |
| 8 | + So this checks, in order, the three things everything else assumes — | |
| 9 | + | |
| 10 | + 1. the contract version, which is the object saying it is the one the | |
| 11 | + bindings were generated from; | |
| 12 | + 2. a handle's whole life — construct a MoqClient, then free it — which is | |
| 13 | + the RustCallStatus out-parameter working in both directions; | |
| 14 | + 3. a string out and back, which is the RustBuffer layout and the | |
| 15 | + alloc/free ownership rule. | |
| 16 | + | |
| 17 | + It deliberately does NOT connect. A connect is a future, a tokio worker and | |
| 18 | + a network, and none of those tell you anything if the layouts are wrong. | |
| 19 | + | |
| 20 | + just repl -m frq.moq.smoke" | |
| 21 | + (:require [frq.moq.uniffi :as uniffi] | |
| 22 | + [frq.moq.raw :as raw] | |
| 23 | + [jolt.ffi :as ffi])) | |
| 24 | + | |
| 25 | +(defn- check-contract [] | |
| 26 | + (let [v (uniffi/check-abi!)] | |
| 27 | + (println " contract version:" v "(expected" uniffi/expected-contract ")") | |
| 28 | + true)) | |
| 29 | + | |
| 30 | +(defn- check-handle | |
| 31 | + "Construct and free a MoqClient. | |
| 32 | + | |
| 33 | + `moqclient_new` is the one constructor that takes nothing but a status, so | |
| 34 | + it isolates the status protocol from any argument lowering. The free is not | |
| 35 | + a courtesy: it is the other half of the handle contract, and a binding that | |
| 36 | + cannot free is a binding that leaks a QUIC endpoint per call." | |
| 37 | + [] | |
| 38 | + (let [h (uniffi/with-out-status #(raw/constructor-moqclient-new %))] | |
| 39 | + (println " moqclient_new ->" h) | |
| 40 | + (when (zero? h) | |
| 41 | + (throw (ex-info "moqclient_new answered a null handle" {}))) | |
| 42 | + (uniffi/with-out-status #(raw/free-moqclient h %)) | |
| 43 | + (println " free_moqclient ok") | |
| 44 | + true)) | |
| 45 | + | |
| 46 | +(defn- check-string | |
| 47 | + "Send a string into a RustBuffer and read it back out. | |
| 48 | + | |
| 49 | + The value is chosen to catch the two mistakes a length-counted buffer | |
| 50 | + invites: multi-byte UTF-8 (a length in characters rather than bytes reads | |
| 51 | + short) and a trailing character (a NUL-terminated read runs past the end)." | |
| 52 | + [] | |
| 53 | + (let [s "moq://relay.example/ünïcode/✓"] | |
| 54 | + (ffi/with-arena [a] | |
| 55 | + (let [buf (ffi/alloc a (ffi/layout-size uniffi/rust-buffer))] | |
| 56 | + (uniffi/lower-string buf s) | |
| 57 | + (let [len (ffi/read-field buf uniffi/rust-buffer [:len]) | |
| 58 | + got (uniffi/lift-string buf)] | |
| 59 | + (println " lowered" (count s) "chars ->" len "bytes in the buffer") | |
| 60 | + (println " lifted " (pr-str got)) | |
| 61 | + (when-not (= s got) | |
| 62 | + (throw (ex-info "string did not round trip" | |
| 63 | + {:sent s :got got}))) | |
| 64 | + true))))) | |
| 65 | + | |
| 66 | +(defn -main [& _] | |
| 67 | + (println "libmoq_ffi smoke test") | |
| 68 | + (let [steps [["contract" check-contract] | |
| 69 | + ["handle" check-handle] | |
| 70 | + ["string" check-string]]] | |
| 71 | + (doseq [[name f] steps] | |
| 72 | + (println (str name ":")) | |
| 73 | + (f)) | |
| 74 | + (println "all ok"))) | |
| new file mode 100644 | |||
| @@ -0,0 +1,74 @@ | |||
| 1 | +(ns frq.moq.smoke | ||
| 2 | + "The smallest round trip that proves the generated bindings are real. | ||
| 3 | + | ||
| 4 | + Nothing in `frq.moq.*` has crossed the ABI until something does, and the | ||
| 5 | + failure modes here are not the kind that announce themselves: a RustBuffer | ||
| 6 | + whose fields are the wrong width reads as plausible garbage, and a handle | ||
| 7 | + freed twice corrupts an allocator some minutes later rather than at the call. | ||
| 8 | + So this checks, in order, the three things everything else assumes — | ||
| 9 | + | ||
| 10 | + 1. the contract version, which is the object saying it is the one the | ||
| 11 | + bindings were generated from; | ||
| 12 | + 2. a handle's whole life — construct a MoqClient, then free it — which is | ||
| 13 | + the RustCallStatus out-parameter working in both directions; | ||
| 14 | + 3. a string out and back, which is the RustBuffer layout and the | ||
| 15 | + alloc/free ownership rule. | ||
| 16 | + | ||
| 17 | + It deliberately does NOT connect. A connect is a future, a tokio worker and | ||
| 18 | + a network, and none of those tell you anything if the layouts are wrong. | ||
| 19 | + | ||
| 20 | + just repl -m frq.moq.smoke" | ||
| 21 | + (:require [frq.moq.uniffi :as uniffi] | ||
| 22 | + [frq.moq.raw :as raw] | ||
| 23 | + [jolt.ffi :as ffi])) | ||
| 24 | + | ||
| 25 | +(defn- check-contract [] | ||
| 26 | + (let [v (uniffi/check-abi!)] | ||
| 27 | + (println " contract version:" v "(expected" uniffi/expected-contract ")") | ||
| 28 | + true)) | ||
| 29 | + | ||
| 30 | +(defn- check-handle | ||
| 31 | + "Construct and free a MoqClient. | ||
| 32 | + | ||
| 33 | + `moqclient_new` is the one constructor that takes nothing but a status, so | ||
| 34 | + it isolates the status protocol from any argument lowering. The free is not | ||
| 35 | + a courtesy: it is the other half of the handle contract, and a binding that | ||
| 36 | + cannot free is a binding that leaks a QUIC endpoint per call." | ||
| 37 | + [] | ||
| 38 | + (let [h (uniffi/with-out-status #(raw/constructor-moqclient-new %))] | ||
| 39 | + (println " moqclient_new ->" h) | ||
| 40 | + (when (zero? h) | ||
| 41 | + (throw (ex-info "moqclient_new answered a null handle" {}))) | ||
| 42 | + (uniffi/with-out-status #(raw/free-moqclient h %)) | ||
| 43 | + (println " free_moqclient ok") | ||
| 44 | + true)) | ||
| 45 | + | ||
| 46 | +(defn- check-string | ||
| 47 | + "Send a string into a RustBuffer and read it back out. | ||
| 48 | + | ||
| 49 | + The value is chosen to catch the two mistakes a length-counted buffer | ||
| 50 | + invites: multi-byte UTF-8 (a length in characters rather than bytes reads | ||
| 51 | + short) and a trailing character (a NUL-terminated read runs past the end)." | ||
| 52 | + [] | ||
| 53 | + (let [s "moq://relay.example/ünïcode/✓"] | ||
| 54 | + (ffi/with-arena [a] | ||
| 55 | + (let [buf (ffi/alloc a (ffi/layout-size uniffi/rust-buffer))] | ||
| 56 | + (uniffi/lower-string buf s) | ||
| 57 | + (let [len (ffi/read-field buf uniffi/rust-buffer [:len]) | ||
| 58 | + got (uniffi/lift-string buf)] | ||
| 59 | + (println " lowered" (count s) "chars ->" len "bytes in the buffer") | ||
| 60 | + (println " lifted " (pr-str got)) | ||
| 61 | + (when-not (= s got) | ||
| 62 | + (throw (ex-info "string did not round trip" | ||
| 63 | + {:sent s :got got}))) | ||
| 64 | + true))))) | ||
| 65 | + | ||
| 66 | +(defn -main [& _] | ||
| 67 | + (println "libmoq_ffi smoke test") | ||
| 68 | + (let [steps [["contract" check-contract] | ||
| 69 | + ["handle" check-handle] | ||
| 70 | + ["string" check-string]]] | ||
| 71 | + (doseq [[name f] steps] | ||
| 72 | + (println (str name ":")) | ||
| 73 | + (f)) | ||
| 74 | + (println "all ok"))) | ||
added
src/frq/moq/uniffi.clj +266 -0 | new file mode 100644 | ||
| @@ -0,0 +1,266 @@ | ||
| 1 | +(ns frq.moq.uniffi | |
| 2 | + "The UniFFI ABI, in jolt — the substrate every `frq.moq.*` binding sits on. | |
| 3 | + | |
| 4 | + `libmoq_ffi` is not a hand-written C library. It is what UniFFI generates, | |
| 5 | + and its shape is the same one UniFFI's Swift and Kotlin backends consume: | |
| 6 | + | |
| 7 | + * **Values cross as `RustBuffer`** — a {capacity, len, data} triple, passed | |
| 8 | + and returned BY VALUE. A string is its UTF-8 bytes in one; so is a lowered | |
| 9 | + error. The buffer is Rust-owned and must go back through `rustbuffer_free`. | |
| 10 | + * **Errors are an out-parameter.** Every fallible entry point takes a | |
| 11 | + trailing `RustCallStatus *`, and the `code` byte in it says what happened: | |
| 12 | + 0 succeeded, 1 threw (the lowered error is in `errorBuf`), 2 panicked (a | |
| 13 | + message is in `errorBuf`). | |
| 14 | + * **Objects are handles**, not pointers — a `uint64_t` with `clone_*` and | |
| 15 | + `free_*` around it. A handle is cloned before each method call and freed | |
| 16 | + once, which is what UniFFI's generated code does and why doing it by hand | |
| 17 | + is the part to get right. | |
| 18 | + * **Async is a future to be polled.** `connect` and friends return a future | |
| 19 | + handle rather than a value: poll it with a continuation callback, and when | |
| 20 | + the callback reports READY, `complete` it for the result and `free` it. | |
| 21 | + | |
| 22 | + Two facts about the far side shape the async half here. The continuation is | |
| 23 | + invoked from a tokio worker — a thread jolt did not start — so it is built in | |
| 24 | + an `auto-arena` and marked `:collect-safe`, which is exactly the case that | |
| 25 | + arena documents. And `frq.av`'s contract is that nothing calls back into the | |
| 26 | + UI: the continuation therefore does the smallest possible thing, flipping a | |
| 27 | + flag, and `settled?` is what a caller on the loop thread asks. | |
| 28 | + | |
| 29 | + The version guard is not optional. UniFFI writes a contract version and a | |
| 30 | + per-method checksum into the object, and a `libmoq_ffi` built from a | |
| 31 | + different revision will have the same symbol names with different layouts | |
| 32 | + behind them. `check-abi!` is called once at load; a mismatch is a hard error | |
| 33 | + rather than a corrupted read some minutes into a call." | |
| 34 | + (:require [jolt.ffi :as ffi] | |
| 35 | + [frq.moq.raw :as raw])) | |
| 36 | + | |
| 37 | +;; --- the primitives ---------------------------------------------------------- | |
| 38 | +;; UNIFFI_SHARED_HEADER_V4. These three are stable across uniffied crates — | |
| 39 | +;; the header carries a guard that refuses to mix versions, and these layouts | |
| 40 | +;; are that version's. | |
| 41 | + | |
| 42 | +(def rust-buffer | |
| 43 | + (ffi/layout [:struct [[:capacity :uint64] | |
| 44 | + [:len :uint64] | |
| 45 | + [:data :pointer]]])) | |
| 46 | + | |
| 47 | +(def foreign-bytes | |
| 48 | + (ffi/layout [:struct [[:len :int32] | |
| 49 | + [:data :pointer]]])) | |
| 50 | + | |
| 51 | +(def rust-call-status | |
| 52 | + (ffi/layout [:struct [[:code :int8] | |
| 53 | + [:error-buf [:struct [[:capacity :uint64] | |
| 54 | + [:len :uint64] | |
| 55 | + [:data :pointer]]]]]])) | |
| 56 | + | |
| 57 | +;; `code` in a RustCallStatus. | |
| 58 | +(def ^:const status-ok 0) | |
| 59 | +(def ^:const status-error 1) | |
| 60 | +(def ^:const status-panic 2) | |
| 61 | + | |
| 62 | +;; What a continuation is handed. READY means `complete` will not block; | |
| 63 | +;; MAYBE-READY means poll again. | |
| 64 | +(def ^:const poll-ready 0) | |
| 65 | +(def ^:const poll-maybe-ready 1) | |
| 66 | + | |
| 67 | +;; --- the entry points ------------------------------------------------------- | |
| 68 | +;; Not redeclared here. `frq.moq.raw` is generated from the object's own | |
| 69 | +;; embedded metadata and already declares all 403 of them, including these — | |
| 70 | +;; so this namespace binds behaviour to them rather than restating signatures | |
| 71 | +;; that a regeneration could move underneath it. | |
| 72 | + | |
| 73 | +;; --- errors ------------------------------------------------------------------ | |
| 74 | + | |
| 75 | +;; Forward: `with-out-status` expands to a call to this, and jolt resolves the | |
| 76 | +;; expansion when it ANALYSES it rather than when it runs. | |
| 77 | +(declare throw-status!) | |
| 78 | + | |
| 79 | +(defmacro with-out-status | |
| 80 | + "Run `f` with a zeroed RustCallStatus, then raise if it came back non-ok. | |
| 81 | + | |
| 82 | + Every fallible entry point in the object takes one of these as its last | |
| 83 | + argument, so this is the shape nearly every call in `frq.moq.*` wears. The | |
| 84 | + status is confined: it lives exactly as long as the call." | |
| 85 | + [f] | |
| 86 | + `(ffi/with-arena [a#] | |
| 87 | + (let [s# (ffi/alloc a# (ffi/layout-size rust-call-status))] | |
| 88 | + (ffi/write s# rust-call-status {:code status-ok | |
| 89 | + :error-buf {:capacity 0 :len 0 | |
| 90 | + :data ffi/null}}) | |
| 91 | + (let [v# (~f s#)] | |
| 92 | + (if (= status-ok (ffi/read-field s# rust-call-status [:code])) | |
| 93 | + v# | |
| 94 | + (throw-status! s#)))))) | |
| 95 | + | |
| 96 | +(defn- status-message | |
| 97 | + "Read and RELEASE the lowered error sitting in a non-ok status. | |
| 98 | + | |
| 99 | + Both `error` and `panic` put a RustBuffer in `errorBuf`, and both are the | |
| 100 | + caller's to free — the difference is only what is inside. A panic's buffer is | |
| 101 | + a bare UTF-8 message; an error's is the lowered `MoqError`, whose first bytes | |
| 102 | + are a variant discriminant. Neither is decoded here: this namespace does not | |
| 103 | + know MoqError's shape, so it reports the bytes it can and leaves lifting the | |
| 104 | + variant to the binding that declared the type. | |
| 105 | + | |
| 106 | + The free goes through a status of its own rather than `with-out-status`: this | |
| 107 | + is already the error path, and a raise from freeing an error buffer would | |
| 108 | + lose the error that got us here." | |
| 109 | + [status-ptr] | |
| 110 | + (let [len (ffi/read-field status-ptr rust-call-status [:error-buf :len]) | |
| 111 | + data (ffi/read-field status-ptr rust-call-status [:error-buf :data]) | |
| 112 | + text (when (and (pos? len) (not (ffi/null? data))) | |
| 113 | + ;; Not ptr->string: the buffer is length-counted, not | |
| 114 | + ;; NUL-terminated, and a lowered error may hold an interior zero. | |
| 115 | + (ffi/read-bytes data len))] | |
| 116 | + (ffi/with-arena [a] | |
| 117 | + (let [free-status (ffi/alloc a (ffi/layout-size rust-call-status))] | |
| 118 | + (ffi/write free-status rust-call-status | |
| 119 | + {:code status-ok | |
| 120 | + :error-buf {:capacity 0 :len 0 :data ffi/null}}) | |
| 121 | + (raw/rustbuffer-free (ffi/place status-ptr rust-call-status [:error-buf]) | |
| 122 | + free-status))) | |
| 123 | + text)) | |
| 124 | + | |
| 125 | +(defn- throw-status! [status-ptr] | |
| 126 | + (let [code (ffi/read-field status-ptr rust-call-status [:code]) | |
| 127 | + msg (status-message status-ptr)] | |
| 128 | + (throw (ex-info (if (= code status-panic) | |
| 129 | + (str "libmoq_ffi panicked: " msg) | |
| 130 | + (str "libmoq_ffi call failed: " msg)) | |
| 131 | + {:code code :message msg})))) | |
| 132 | + | |
| 133 | +;; --- strings ----------------------------------------------------------------- | |
| 134 | + | |
| 135 | +(defn lower-string | |
| 136 | + "Copy `s` into a Rust-owned RustBuffer, written into `dest`. | |
| 137 | + | |
| 138 | + UniFFI lowers a bare String as its UTF-8 bytes with no length prefix — the | |
| 139 | + buffer's own `len` is the length. `from_bytes` copies, so the ForeignBytes | |
| 140 | + jolt hands over may live in a confined arena and die with this call. | |
| 141 | + | |
| 142 | + The bytes come from `string->ptr`, which encodes UTF-8 and records the size | |
| 143 | + it allocated; that size counts the NUL it appends, which is why the length | |
| 144 | + handed to Rust is one less. A NUL is not part of the value here — a | |
| 145 | + RustBuffer is length-counted, and including the terminator would append a | |
| 146 | + zero byte to every string that crossed." | |
| 147 | + [dest s] | |
| 148 | + (ffi/with-arena [a] | |
| 149 | + (let [p (ffi/string->ptr a s) | |
| 150 | + n (max 0 (dec (ffi/size p))) | |
| 151 | + fbs (ffi/alloc a (ffi/layout-size foreign-bytes))] | |
| 152 | + (ffi/write fbs foreign-bytes {:len n :data p}) | |
| 153 | + (with-out-status #(raw/rustbuffer-from-bytes dest fbs %)) | |
| 154 | + dest))) | |
| 155 | + | |
| 156 | +(defn lift-string | |
| 157 | + "Read a returned RustBuffer as a string and free it. | |
| 158 | + | |
| 159 | + `read-bytes` decodes UTF-8 itself, so the length-counted bytes become a jolt | |
| 160 | + string in one block move — no NUL is looked for, which is what a buffer that | |
| 161 | + may hold an interior zero needs. | |
| 162 | + | |
| 163 | + The buffer is Rust-owned, so it goes back through `rustbuffer_free` whether | |
| 164 | + or not it held anything: a zero-length buffer still carries a capacity." | |
| 165 | + [rb-ptr] | |
| 166 | + (let [len (ffi/read-field rb-ptr rust-buffer [:len]) | |
| 167 | + data (ffi/read-field rb-ptr rust-buffer [:data]) | |
| 168 | + s (if (and (pos? len) (not (ffi/null? data))) | |
| 169 | + (ffi/read-bytes data len) | |
| 170 | + "")] | |
| 171 | + (with-out-status #(raw/rustbuffer-free rb-ptr %)) | |
| 172 | + s)) | |
| 173 | + | |
| 174 | +;; --- futures ----------------------------------------------------------------- | |
| 175 | + | |
| 176 | +(defn- continuation | |
| 177 | + "A `void (uint64_t data, int8_t poll_result)` for the far side to invoke. | |
| 178 | + | |
| 179 | + Built in the auto-arena and `:collect-safe` on purpose: tokio calls this from | |
| 180 | + a worker thread jolt never started, and no lexical scope on this side is the | |
| 181 | + callback's lifetime — which is the case `ffi/auto-arena` exists for. | |
| 182 | + | |
| 183 | + It does as little as a callback can. Recording the poll result into an atom | |
| 184 | + is the whole body; nothing here touches glimmer, allocates a jolt value that | |
| 185 | + outlives the call, or re-enters the object. `frq.av`'s rule that nothing | |
| 186 | + calls back into the UI survives because the UI is never on this path — a | |
| 187 | + caller on the loop thread reads the atom instead." | |
| 188 | + [state] | |
| 189 | + (ffi/callback (ffi/auto-arena) | |
| 190 | + (fn [_data result] (reset! state (long result))) | |
| 191 | + [:uint64 :int8] :void | |
| 192 | + :collect-safe)) | |
| 193 | + | |
| 194 | +(defn start-future | |
| 195 | + "Begin polling `handle`, and answer a map the loop thread can interrogate. | |
| 196 | + | |
| 197 | + `kind` picks the width family — :u64 for an object or integer result, :void | |
| 198 | + for one that resolves to nothing, :rb for a value that arrives as a buffer. | |
| 199 | + The future is NOT awaited here: `settled?` says whether it is ready and | |
| 200 | + `complete!` takes the result, so a caller drives this from the same timer | |
| 201 | + that drives `frq.av/pump!` rather than blocking the loop." | |
| 202 | + [handle kind] | |
| 203 | + (let [state (atom nil) | |
| 204 | + cb (continuation state) | |
| 205 | + poll (case kind | |
| 206 | + :u64 raw/rust-future-poll-u64 | |
| 207 | + :void raw/rust-future-poll-void | |
| 208 | + :rb raw/rust-future-poll-rust-buffer)] | |
| 209 | + (poll handle cb 0) | |
| 210 | + {:handle handle :kind kind :state state :callback cb :poll poll})) | |
| 211 | + | |
| 212 | +(defn settled? | |
| 213 | + "Has the continuation reported READY? | |
| 214 | + | |
| 215 | + MAYBE-READY means the far side wants another poll, which this issues and | |
| 216 | + then answers false — so calling `settled?` from a timer is what advances a | |
| 217 | + future, and there is no thread on this side waiting on one." | |
| 218 | + [{:keys [handle state poll callback]}] | |
| 219 | + (let [r @state] | |
| 220 | + (cond | |
| 221 | + (nil? r) false | |
| 222 | + (= r poll-ready) true | |
| 223 | + (= r poll-maybe-ready) (do (reset! state nil) | |
| 224 | + (poll handle callback 0) | |
| 225 | + false) | |
| 226 | + :else false))) | |
| 227 | + | |
| 228 | +(defn complete! | |
| 229 | + "Take a settled future's result and release it. | |
| 230 | + | |
| 231 | + Only valid once `settled?` has answered true — completing early is what | |
| 232 | + blocks the calling thread, which on the loop thread is the freeze this whole | |
| 233 | + polling shape exists to avoid. The future handle is freed either way, so a | |
| 234 | + raising `complete` still does not leak one." | |
| 235 | + [{:keys [handle kind]}] | |
| 236 | + (try | |
| 237 | + (case kind | |
| 238 | + :u64 (with-out-status #(raw/rust-future-complete-u64 handle %)) | |
| 239 | + :void (do (with-out-status #(raw/rust-future-complete-void handle %)) nil) | |
| 240 | + :rb (ffi/with-arena [a] | |
| 241 | + (let [out (ffi/alloc a (ffi/layout-size rust-buffer))] | |
| 242 | + (with-out-status #(raw/rust-future-complete-rust-buffer out handle %)) | |
| 243 | + out))) | |
| 244 | + (finally | |
| 245 | + (case kind | |
| 246 | + :u64 (raw/rust-future-free-u64 handle) | |
| 247 | + :void (raw/rust-future-free-void handle) | |
| 248 | + :rb (raw/rust-future-free-rust-buffer handle))))) | |
| 249 | + | |
| 250 | +;; --- the version guard ------------------------------------------------------- | |
| 251 | + | |
| 252 | +;; What this file was written against: moq-ffi 0.3.17, UniFFI contract 30. | |
| 253 | +;; Both are asserted rather than assumed — see the namespace docstring on why a | |
| 254 | +;; silent mismatch is the failure mode worth spending a startup check on. | |
| 255 | +(def ^:const expected-contract 30) | |
| 256 | + | |
| 257 | +(defn check-abi! | |
| 258 | + "Refuse a `libmoq_ffi` this file was not written against." | |
| 259 | + [] | |
| 260 | + (let [v (raw/uniffi-contract-version)] | |
| 261 | + (when-not (= v expected-contract) | |
| 262 | + (throw (ex-info (str "libmoq_ffi UniFFI contract " v | |
| 263 | + ", expected " expected-contract | |
| 264 | + " — frq.moq.* was generated against moq-ffi 0.3.17") | |
| 265 | + {:found v :expected expected-contract}))) | |
| 266 | + v)) | |
| new file mode 100644 | |||
| @@ -0,0 +1,266 @@ | |||
| 1 | +(ns frq.moq.uniffi | ||
| 2 | + "The UniFFI ABI, in jolt — the substrate every `frq.moq.*` binding sits on. | ||
| 3 | + | ||
| 4 | + `libmoq_ffi` is not a hand-written C library. It is what UniFFI generates, | ||
| 5 | + and its shape is the same one UniFFI's Swift and Kotlin backends consume: | ||
| 6 | + | ||
| 7 | + * **Values cross as `RustBuffer`** — a {capacity, len, data} triple, passed | ||
| 8 | + and returned BY VALUE. A string is its UTF-8 bytes in one; so is a lowered | ||
| 9 | + error. The buffer is Rust-owned and must go back through `rustbuffer_free`. | ||
| 10 | + * **Errors are an out-parameter.** Every fallible entry point takes a | ||
| 11 | + trailing `RustCallStatus *`, and the `code` byte in it says what happened: | ||
| 12 | + 0 succeeded, 1 threw (the lowered error is in `errorBuf`), 2 panicked (a | ||
| 13 | + message is in `errorBuf`). | ||
| 14 | + * **Objects are handles**, not pointers — a `uint64_t` with `clone_*` and | ||
| 15 | + `free_*` around it. A handle is cloned before each method call and freed | ||
| 16 | + once, which is what UniFFI's generated code does and why doing it by hand | ||
| 17 | + is the part to get right. | ||
| 18 | + * **Async is a future to be polled.** `connect` and friends return a future | ||
| 19 | + handle rather than a value: poll it with a continuation callback, and when | ||
| 20 | + the callback reports READY, `complete` it for the result and `free` it. | ||
| 21 | + | ||
| 22 | + Two facts about the far side shape the async half here. The continuation is | ||
| 23 | + invoked from a tokio worker — a thread jolt did not start — so it is built in | ||
| 24 | + an `auto-arena` and marked `:collect-safe`, which is exactly the case that | ||
| 25 | + arena documents. And `frq.av`'s contract is that nothing calls back into the | ||
| 26 | + UI: the continuation therefore does the smallest possible thing, flipping a | ||
| 27 | + flag, and `settled?` is what a caller on the loop thread asks. | ||
| 28 | + | ||
| 29 | + The version guard is not optional. UniFFI writes a contract version and a | ||
| 30 | + per-method checksum into the object, and a `libmoq_ffi` built from a | ||
| 31 | + different revision will have the same symbol names with different layouts | ||
| 32 | + behind them. `check-abi!` is called once at load; a mismatch is a hard error | ||
| 33 | + rather than a corrupted read some minutes into a call." | ||
| 34 | + (:require [jolt.ffi :as ffi] | ||
| 35 | + [frq.moq.raw :as raw])) | ||
| 36 | + | ||
| 37 | +;; --- the primitives ---------------------------------------------------------- | ||
| 38 | +;; UNIFFI_SHARED_HEADER_V4. These three are stable across uniffied crates — | ||
| 39 | +;; the header carries a guard that refuses to mix versions, and these layouts | ||
| 40 | +;; are that version's. | ||
| 41 | + | ||
| 42 | +(def rust-buffer | ||
| 43 | + (ffi/layout [:struct [[:capacity :uint64] | ||
| 44 | + [:len :uint64] | ||
| 45 | + [:data :pointer]]])) | ||
| 46 | + | ||
| 47 | +(def foreign-bytes | ||
| 48 | + (ffi/layout [:struct [[:len :int32] | ||
| 49 | + [:data :pointer]]])) | ||
| 50 | + | ||
| 51 | +(def rust-call-status | ||
| 52 | + (ffi/layout [:struct [[:code :int8] | ||
| 53 | + [:error-buf [:struct [[:capacity :uint64] | ||
| 54 | + [:len :uint64] | ||
| 55 | + [:data :pointer]]]]]])) | ||
| 56 | + | ||
| 57 | +;; `code` in a RustCallStatus. | ||
| 58 | +(def ^:const status-ok 0) | ||
| 59 | +(def ^:const status-error 1) | ||
| 60 | +(def ^:const status-panic 2) | ||
| 61 | + | ||
| 62 | +;; What a continuation is handed. READY means `complete` will not block; | ||
| 63 | +;; MAYBE-READY means poll again. | ||
| 64 | +(def ^:const poll-ready 0) | ||
| 65 | +(def ^:const poll-maybe-ready 1) | ||
| 66 | + | ||
| 67 | +;; --- the entry points ------------------------------------------------------- | ||
| 68 | +;; Not redeclared here. `frq.moq.raw` is generated from the object's own | ||
| 69 | +;; embedded metadata and already declares all 403 of them, including these — | ||
| 70 | +;; so this namespace binds behaviour to them rather than restating signatures | ||
| 71 | +;; that a regeneration could move underneath it. | ||
| 72 | + | ||
| 73 | +;; --- errors ------------------------------------------------------------------ | ||
| 74 | + | ||
| 75 | +;; Forward: `with-out-status` expands to a call to this, and jolt resolves the | ||
| 76 | +;; expansion when it ANALYSES it rather than when it runs. | ||
| 77 | +(declare throw-status!) | ||
| 78 | + | ||
| 79 | +(defmacro with-out-status | ||
| 80 | + "Run `f` with a zeroed RustCallStatus, then raise if it came back non-ok. | ||
| 81 | + | ||
| 82 | + Every fallible entry point in the object takes one of these as its last | ||
| 83 | + argument, so this is the shape nearly every call in `frq.moq.*` wears. The | ||
| 84 | + status is confined: it lives exactly as long as the call." | ||
| 85 | + [f] | ||
| 86 | + `(ffi/with-arena [a#] | ||
| 87 | + (let [s# (ffi/alloc a# (ffi/layout-size rust-call-status))] | ||
| 88 | + (ffi/write s# rust-call-status {:code status-ok | ||
| 89 | + :error-buf {:capacity 0 :len 0 | ||
| 90 | + :data ffi/null}}) | ||
| 91 | + (let [v# (~f s#)] | ||
| 92 | + (if (= status-ok (ffi/read-field s# rust-call-status [:code])) | ||
| 93 | + v# | ||
| 94 | + (throw-status! s#)))))) | ||
| 95 | + | ||
| 96 | +(defn- status-message | ||
| 97 | + "Read and RELEASE the lowered error sitting in a non-ok status. | ||
| 98 | + | ||
| 99 | + Both `error` and `panic` put a RustBuffer in `errorBuf`, and both are the | ||
| 100 | + caller's to free — the difference is only what is inside. A panic's buffer is | ||
| 101 | + a bare UTF-8 message; an error's is the lowered `MoqError`, whose first bytes | ||
| 102 | + are a variant discriminant. Neither is decoded here: this namespace does not | ||
| 103 | + know MoqError's shape, so it reports the bytes it can and leaves lifting the | ||
| 104 | + variant to the binding that declared the type. | ||
| 105 | + | ||
| 106 | + The free goes through a status of its own rather than `with-out-status`: this | ||
| 107 | + is already the error path, and a raise from freeing an error buffer would | ||
| 108 | + lose the error that got us here." | ||
| 109 | + [status-ptr] | ||
| 110 | + (let [len (ffi/read-field status-ptr rust-call-status [:error-buf :len]) | ||
| 111 | + data (ffi/read-field status-ptr rust-call-status [:error-buf :data]) | ||
| 112 | + text (when (and (pos? len) (not (ffi/null? data))) | ||
| 113 | + ;; Not ptr->string: the buffer is length-counted, not | ||
| 114 | + ;; NUL-terminated, and a lowered error may hold an interior zero. | ||
| 115 | + (ffi/read-bytes data len))] | ||
| 116 | + (ffi/with-arena [a] | ||
| 117 | + (let [free-status (ffi/alloc a (ffi/layout-size rust-call-status))] | ||
| 118 | + (ffi/write free-status rust-call-status | ||
| 119 | + {:code status-ok | ||
| 120 | + :error-buf {:capacity 0 :len 0 :data ffi/null}}) | ||
| 121 | + (raw/rustbuffer-free (ffi/place status-ptr rust-call-status [:error-buf]) | ||
| 122 | + free-status))) | ||
| 123 | + text)) | ||
| 124 | + | ||
| 125 | +(defn- throw-status! [status-ptr] | ||
| 126 | + (let [code (ffi/read-field status-ptr rust-call-status [:code]) | ||
| 127 | + msg (status-message status-ptr)] | ||
| 128 | + (throw (ex-info (if (= code status-panic) | ||
| 129 | + (str "libmoq_ffi panicked: " msg) | ||
| 130 | + (str "libmoq_ffi call failed: " msg)) | ||
| 131 | + {:code code :message msg})))) | ||
| 132 | + | ||
| 133 | +;; --- strings ----------------------------------------------------------------- | ||
| 134 | + | ||
| 135 | +(defn lower-string | ||
| 136 | + "Copy `s` into a Rust-owned RustBuffer, written into `dest`. | ||
| 137 | + | ||
| 138 | + UniFFI lowers a bare String as its UTF-8 bytes with no length prefix — the | ||
| 139 | + buffer's own `len` is the length. `from_bytes` copies, so the ForeignBytes | ||
| 140 | + jolt hands over may live in a confined arena and die with this call. | ||
| 141 | + | ||
| 142 | + The bytes come from `string->ptr`, which encodes UTF-8 and records the size | ||
| 143 | + it allocated; that size counts the NUL it appends, which is why the length | ||
| 144 | + handed to Rust is one less. A NUL is not part of the value here — a | ||
| 145 | + RustBuffer is length-counted, and including the terminator would append a | ||
| 146 | + zero byte to every string that crossed." | ||
| 147 | + [dest s] | ||
| 148 | + (ffi/with-arena [a] | ||
| 149 | + (let [p (ffi/string->ptr a s) | ||
| 150 | + n (max 0 (dec (ffi/size p))) | ||
| 151 | + fbs (ffi/alloc a (ffi/layout-size foreign-bytes))] | ||
| 152 | + (ffi/write fbs foreign-bytes {:len n :data p}) | ||
| 153 | + (with-out-status #(raw/rustbuffer-from-bytes dest fbs %)) | ||
| 154 | + dest))) | ||
| 155 | + | ||
| 156 | +(defn lift-string | ||
| 157 | + "Read a returned RustBuffer as a string and free it. | ||
| 158 | + | ||
| 159 | + `read-bytes` decodes UTF-8 itself, so the length-counted bytes become a jolt | ||
| 160 | + string in one block move — no NUL is looked for, which is what a buffer that | ||
| 161 | + may hold an interior zero needs. | ||
| 162 | + | ||
| 163 | + The buffer is Rust-owned, so it goes back through `rustbuffer_free` whether | ||
| 164 | + or not it held anything: a zero-length buffer still carries a capacity." | ||
| 165 | + [rb-ptr] | ||
| 166 | + (let [len (ffi/read-field rb-ptr rust-buffer [:len]) | ||
| 167 | + data (ffi/read-field rb-ptr rust-buffer [:data]) | ||
| 168 | + s (if (and (pos? len) (not (ffi/null? data))) | ||
| 169 | + (ffi/read-bytes data len) | ||
| 170 | + "")] | ||
| 171 | + (with-out-status #(raw/rustbuffer-free rb-ptr %)) | ||
| 172 | + s)) | ||
| 173 | + | ||
| 174 | +;; --- futures ----------------------------------------------------------------- | ||
| 175 | + | ||
| 176 | +(defn- continuation | ||
| 177 | + "A `void (uint64_t data, int8_t poll_result)` for the far side to invoke. | ||
| 178 | + | ||
| 179 | + Built in the auto-arena and `:collect-safe` on purpose: tokio calls this from | ||
| 180 | + a worker thread jolt never started, and no lexical scope on this side is the | ||
| 181 | + callback's lifetime — which is the case `ffi/auto-arena` exists for. | ||
| 182 | + | ||
| 183 | + It does as little as a callback can. Recording the poll result into an atom | ||
| 184 | + is the whole body; nothing here touches glimmer, allocates a jolt value that | ||
| 185 | + outlives the call, or re-enters the object. `frq.av`'s rule that nothing | ||
| 186 | + calls back into the UI survives because the UI is never on this path — a | ||
| 187 | + caller on the loop thread reads the atom instead." | ||
| 188 | + [state] | ||
| 189 | + (ffi/callback (ffi/auto-arena) | ||
| 190 | + (fn [_data result] (reset! state (long result))) | ||
| 191 | + [:uint64 :int8] :void | ||
| 192 | + :collect-safe)) | ||
| 193 | + | ||
| 194 | +(defn start-future | ||
| 195 | + "Begin polling `handle`, and answer a map the loop thread can interrogate. | ||
| 196 | + | ||
| 197 | + `kind` picks the width family — :u64 for an object or integer result, :void | ||
| 198 | + for one that resolves to nothing, :rb for a value that arrives as a buffer. | ||
| 199 | + The future is NOT awaited here: `settled?` says whether it is ready and | ||
| 200 | + `complete!` takes the result, so a caller drives this from the same timer | ||
| 201 | + that drives `frq.av/pump!` rather than blocking the loop." | ||
| 202 | + [handle kind] | ||
| 203 | + (let [state (atom nil) | ||
| 204 | + cb (continuation state) | ||
| 205 | + poll (case kind | ||
| 206 | + :u64 raw/rust-future-poll-u64 | ||
| 207 | + :void raw/rust-future-poll-void | ||
| 208 | + :rb raw/rust-future-poll-rust-buffer)] | ||
| 209 | + (poll handle cb 0) | ||
| 210 | + {:handle handle :kind kind :state state :callback cb :poll poll})) | ||
| 211 | + | ||
| 212 | +(defn settled? | ||
| 213 | + "Has the continuation reported READY? | ||
| 214 | + | ||
| 215 | + MAYBE-READY means the far side wants another poll, which this issues and | ||
| 216 | + then answers false — so calling `settled?` from a timer is what advances a | ||
| 217 | + future, and there is no thread on this side waiting on one." | ||
| 218 | + [{:keys [handle state poll callback]}] | ||
| 219 | + (let [r @state] | ||
| 220 | + (cond | ||
| 221 | + (nil? r) false | ||
| 222 | + (= r poll-ready) true | ||
| 223 | + (= r poll-maybe-ready) (do (reset! state nil) | ||
| 224 | + (poll handle callback 0) | ||
| 225 | + false) | ||
| 226 | + :else false))) | ||
| 227 | + | ||
| 228 | +(defn complete! | ||
| 229 | + "Take a settled future's result and release it. | ||
| 230 | + | ||
| 231 | + Only valid once `settled?` has answered true — completing early is what | ||
| 232 | + blocks the calling thread, which on the loop thread is the freeze this whole | ||
| 233 | + polling shape exists to avoid. The future handle is freed either way, so a | ||
| 234 | + raising `complete` still does not leak one." | ||
| 235 | + [{:keys [handle kind]}] | ||
| 236 | + (try | ||
| 237 | + (case kind | ||
| 238 | + :u64 (with-out-status #(raw/rust-future-complete-u64 handle %)) | ||
| 239 | + :void (do (with-out-status #(raw/rust-future-complete-void handle %)) nil) | ||
| 240 | + :rb (ffi/with-arena [a] | ||
| 241 | + (let [out (ffi/alloc a (ffi/layout-size rust-buffer))] | ||
| 242 | + (with-out-status #(raw/rust-future-complete-rust-buffer out handle %)) | ||
| 243 | + out))) | ||
| 244 | + (finally | ||
| 245 | + (case kind | ||
| 246 | + :u64 (raw/rust-future-free-u64 handle) | ||
| 247 | + :void (raw/rust-future-free-void handle) | ||
| 248 | + :rb (raw/rust-future-free-rust-buffer handle))))) | ||
| 249 | + | ||
| 250 | +;; --- the version guard ------------------------------------------------------- | ||
| 251 | + | ||
| 252 | +;; What this file was written against: moq-ffi 0.3.17, UniFFI contract 30. | ||
| 253 | +;; Both are asserted rather than assumed — see the namespace docstring on why a | ||
| 254 | +;; silent mismatch is the failure mode worth spending a startup check on. | ||
| 255 | +(def ^:const expected-contract 30) | ||
| 256 | + | ||
| 257 | +(defn check-abi! | ||
| 258 | + "Refuse a `libmoq_ffi` this file was not written against." | ||
| 259 | + [] | ||
| 260 | + (let [v (raw/uniffi-contract-version)] | ||
| 261 | + (when-not (= v expected-contract) | ||
| 262 | + (throw (ex-info (str "libmoq_ffi UniFFI contract " v | ||
| 263 | + ", expected " expected-contract | ||
| 264 | + " — frq.moq.* was generated against moq-ffi 0.3.17") | ||
| 265 | + {:found v :expected expected-contract}))) | ||
| 266 | + v)) | ||
added
tools/py2jolt.py +106 -0 | new file mode 100644 | ||
| @@ -0,0 +1,106 @@ | ||
| 1 | +#!/usr/bin/env python3 | |
| 2 | +"""Turn uniffi-bindgen's Python output into jolt `defcfn` declarations. | |
| 3 | + | |
| 4 | +The Python backend emits, for every entry point in the library, a pair of | |
| 5 | +lines that together are an exact ABI description: | |
| 6 | + | |
| 7 | + _UniffiLib.uniffi_moq_ffi_fn_method_moqclient_connect.argtypes = ( | |
| 8 | + ctypes.c_uint64, _UniffiRustBuffer, ctypes.POINTER(_UniffiRustCallStatus), | |
| 9 | + ) | |
| 10 | + _UniffiLib.uniffi_moq_ffi_fn_method_moqclient_connect.restype = ctypes.c_uint64 | |
| 11 | + | |
| 12 | +That is generated from the metadata embedded in the .so itself, so it matches | |
| 13 | +the object being bound rather than a header shipped alongside it -- which for | |
| 14 | +this release is a different build (the Apple artifact carries audio/ video, the | |
| 15 | +Linux and Android ones do not). | |
| 16 | +""" | |
| 17 | +import re, sys, collections | |
| 18 | + | |
| 19 | +CTYPE = { | |
| 20 | + "ctypes.c_int8": ":int8", "ctypes.c_uint8": ":uint8", | |
| 21 | + "ctypes.c_int16": ":int16", "ctypes.c_uint16": ":uint16", | |
| 22 | + "ctypes.c_int32": ":int32", "ctypes.c_uint32": ":uint32", | |
| 23 | + "ctypes.c_int64": ":int64", "ctypes.c_uint64": ":uint64", | |
| 24 | + "ctypes.c_float": ":float", "ctypes.c_double": ":double", | |
| 25 | + "ctypes.c_void_p": ":pointer", "ctypes.c_size_t": ":uint64", | |
| 26 | + "None": ":void", | |
| 27 | +} | |
| 28 | +# A RustBuffer crosses by value; a status is always a pointer out-param. | |
| 29 | +RB = "[:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]" | |
| 30 | +STATUS = ":pointer" | |
| 31 | + | |
| 32 | +def conv(t): | |
| 33 | + t = t.strip().rstrip(",").strip() | |
| 34 | + if not t: | |
| 35 | + return None | |
| 36 | + if t in CTYPE: | |
| 37 | + return CTYPE[t] | |
| 38 | + if "RustCallStatus" in t: | |
| 39 | + return STATUS | |
| 40 | + if "RustBuffer" in t: | |
| 41 | + return RB | |
| 42 | + if "ForeignBytes" in t: | |
| 43 | + return "[:by-value [:struct [[:len :int32] [:data :pointer]]]]" | |
| 44 | + if t.startswith("ctypes.POINTER"): | |
| 45 | + return ":pointer" | |
| 46 | + # A function-pointer typedef (the future continuation) -- jolt lowers an | |
| 47 | + # ffi/callback to a plain pointer, so that is what the slot takes. | |
| 48 | + if "callback" in t.lower() or "struct" in t.lower(): | |
| 49 | + return ":pointer" | |
| 50 | + return None # unknown -- reported, never guessed | |
| 51 | + | |
| 52 | +def split_args(s): | |
| 53 | + out, depth, cur = [], 0, "" | |
| 54 | + for ch in s: | |
| 55 | + if ch == "(": | |
| 56 | + depth += 1 | |
| 57 | + elif ch == ")": | |
| 58 | + depth -= 1 | |
| 59 | + if ch == "," and depth == 0: | |
| 60 | + out.append(cur); cur = "" | |
| 61 | + else: | |
| 62 | + cur += ch | |
| 63 | + if cur.strip(): | |
| 64 | + out.append(cur) | |
| 65 | + return out | |
| 66 | + | |
| 67 | +def main(path): | |
| 68 | + src = open(path).read() | |
| 69 | + args = dict(re.findall(r"_UniffiLib\.(\w+)\.argtypes\s*=\s*\(([^)]*(?:\([^)]*\)[^)]*)*)\)", src)) | |
| 70 | + rets = dict(re.findall(r"_UniffiLib\.(\w+)\.restype\s*=\s*(.+)", src)) | |
| 71 | + names = sorted(set(args) | set(rets)) | |
| 72 | + unknown = collections.Counter() | |
| 73 | + rows = [] | |
| 74 | + for n in names: | |
| 75 | + a = [conv(x) for x in split_args(args.get(n, ""))] | |
| 76 | + r = conv(rets.get(n, "None")) | |
| 77 | + if None in a or r is None: | |
| 78 | + for x in split_args(args.get(n, "")) + [rets.get(n, "None")]: | |
| 79 | + if conv(x) is None: | |
| 80 | + unknown[x.strip()] += 1 | |
| 81 | + continue | |
| 82 | + rows.append((n, a, r)) | |
| 83 | + return rows, unknown, len(names) | |
| 84 | + | |
| 85 | +if __name__ == "__main__": | |
| 86 | + rows, unknown, total = main(sys.argv[1]) | |
| 87 | + print(f";; {len(rows)} of {total} entry points bound", file=sys.stderr) | |
| 88 | + if unknown: | |
| 89 | + print(";; UNMAPPED (left unbound rather than guessed):", file=sys.stderr) | |
| 90 | + for t, c in unknown.most_common(): | |
| 91 | + print(f";; {t} x{c}", file=sys.stderr) | |
| 92 | + for n, a, r in rows: | |
| 93 | + # Anchored, longest-first: "uniffi_moq_ffi_checksum_" must not be | |
| 94 | + # eaten by the "ffi_moq_ffi_" that also matches inside it. | |
| 95 | + for pre in ("uniffi_moq_ffi_fn_", "uniffi_moq_ffi_checksum_", | |
| 96 | + "ffi_moq_ffi_", "uniffi_moq_ffi_"): | |
| 97 | + if n.startswith(pre): | |
| 98 | + stem = n[len(pre):] | |
| 99 | + if pre.endswith("checksum_"): | |
| 100 | + stem = "checksum-" + stem | |
| 101 | + break | |
| 102 | + else: | |
| 103 | + stem = n | |
| 104 | + jolt_name = stem.replace("_", "-") | |
| 105 | + argv = " ".join(a) if a else "" | |
| 106 | + print(f'(ffi/defcfn {jolt_name} "{n}" [{argv}] {r})') | |
| new file mode 100644 | |||
| @@ -0,0 +1,106 @@ | |||
| 1 | +#!/usr/bin/env python3 | ||
| 2 | +"""Turn uniffi-bindgen's Python output into jolt `defcfn` declarations. | ||
| 3 | + | ||
| 4 | +The Python backend emits, for every entry point in the library, a pair of | ||
| 5 | +lines that together are an exact ABI description: | ||
| 6 | + | ||
| 7 | + _UniffiLib.uniffi_moq_ffi_fn_method_moqclient_connect.argtypes = ( | ||
| 8 | + ctypes.c_uint64, _UniffiRustBuffer, ctypes.POINTER(_UniffiRustCallStatus), | ||
| 9 | + ) | ||
| 10 | + _UniffiLib.uniffi_moq_ffi_fn_method_moqclient_connect.restype = ctypes.c_uint64 | ||
| 11 | + | ||
| 12 | +That is generated from the metadata embedded in the .so itself, so it matches | ||
| 13 | +the object being bound rather than a header shipped alongside it -- which for | ||
| 14 | +this release is a different build (the Apple artifact carries audio/ video, the | ||
| 15 | +Linux and Android ones do not). | ||
| 16 | +""" | ||
| 17 | +import re, sys, collections | ||
| 18 | + | ||
| 19 | +CTYPE = { | ||
| 20 | + "ctypes.c_int8": ":int8", "ctypes.c_uint8": ":uint8", | ||
| 21 | + "ctypes.c_int16": ":int16", "ctypes.c_uint16": ":uint16", | ||
| 22 | + "ctypes.c_int32": ":int32", "ctypes.c_uint32": ":uint32", | ||
| 23 | + "ctypes.c_int64": ":int64", "ctypes.c_uint64": ":uint64", | ||
| 24 | + "ctypes.c_float": ":float", "ctypes.c_double": ":double", | ||
| 25 | + "ctypes.c_void_p": ":pointer", "ctypes.c_size_t": ":uint64", | ||
| 26 | + "None": ":void", | ||
| 27 | +} | ||
| 28 | +# A RustBuffer crosses by value; a status is always a pointer out-param. | ||
| 29 | +RB = "[:by-value [:struct [[:capacity :uint64] [:len :uint64] [:data :pointer]]]]" | ||
| 30 | +STATUS = ":pointer" | ||
| 31 | + | ||
| 32 | +def conv(t): | ||
| 33 | + t = t.strip().rstrip(",").strip() | ||
| 34 | + if not t: | ||
| 35 | + return None | ||
| 36 | + if t in CTYPE: | ||
| 37 | + return CTYPE[t] | ||
| 38 | + if "RustCallStatus" in t: | ||
| 39 | + return STATUS | ||
| 40 | + if "RustBuffer" in t: | ||
| 41 | + return RB | ||
| 42 | + if "ForeignBytes" in t: | ||
| 43 | + return "[:by-value [:struct [[:len :int32] [:data :pointer]]]]" | ||
| 44 | + if t.startswith("ctypes.POINTER"): | ||
| 45 | + return ":pointer" | ||
| 46 | + # A function-pointer typedef (the future continuation) -- jolt lowers an | ||
| 47 | + # ffi/callback to a plain pointer, so that is what the slot takes. | ||
| 48 | + if "callback" in t.lower() or "struct" in t.lower(): | ||
| 49 | + return ":pointer" | ||
| 50 | + return None # unknown -- reported, never guessed | ||
| 51 | + | ||
| 52 | +def split_args(s): | ||
| 53 | + out, depth, cur = [], 0, "" | ||
| 54 | + for ch in s: | ||
| 55 | + if ch == "(": | ||
| 56 | + depth += 1 | ||
| 57 | + elif ch == ")": | ||
| 58 | + depth -= 1 | ||
| 59 | + if ch == "," and depth == 0: | ||
| 60 | + out.append(cur); cur = "" | ||
| 61 | + else: | ||
| 62 | + cur += ch | ||
| 63 | + if cur.strip(): | ||
| 64 | + out.append(cur) | ||
| 65 | + return out | ||
| 66 | + | ||
| 67 | +def main(path): | ||
| 68 | + src = open(path).read() | ||
| 69 | + args = dict(re.findall(r"_UniffiLib\.(\w+)\.argtypes\s*=\s*\(([^)]*(?:\([^)]*\)[^)]*)*)\)", src)) | ||
| 70 | + rets = dict(re.findall(r"_UniffiLib\.(\w+)\.restype\s*=\s*(.+)", src)) | ||
| 71 | + names = sorted(set(args) | set(rets)) | ||
| 72 | + unknown = collections.Counter() | ||
| 73 | + rows = [] | ||
| 74 | + for n in names: | ||
| 75 | + a = [conv(x) for x in split_args(args.get(n, ""))] | ||
| 76 | + r = conv(rets.get(n, "None")) | ||
| 77 | + if None in a or r is None: | ||
| 78 | + for x in split_args(args.get(n, "")) + [rets.get(n, "None")]: | ||
| 79 | + if conv(x) is None: | ||
| 80 | + unknown[x.strip()] += 1 | ||
| 81 | + continue | ||
| 82 | + rows.append((n, a, r)) | ||
| 83 | + return rows, unknown, len(names) | ||
| 84 | + | ||
| 85 | +if __name__ == "__main__": | ||
| 86 | + rows, unknown, total = main(sys.argv[1]) | ||
| 87 | + print(f";; {len(rows)} of {total} entry points bound", file=sys.stderr) | ||
| 88 | + if unknown: | ||
| 89 | + print(";; UNMAPPED (left unbound rather than guessed):", file=sys.stderr) | ||
| 90 | + for t, c in unknown.most_common(): | ||
| 91 | + print(f";; {t} x{c}", file=sys.stderr) | ||
| 92 | + for n, a, r in rows: | ||
| 93 | + # Anchored, longest-first: "uniffi_moq_ffi_checksum_" must not be | ||
| 94 | + # eaten by the "ffi_moq_ffi_" that also matches inside it. | ||
| 95 | + for pre in ("uniffi_moq_ffi_fn_", "uniffi_moq_ffi_checksum_", | ||
| 96 | + "ffi_moq_ffi_", "uniffi_moq_ffi_"): | ||
| 97 | + if n.startswith(pre): | ||
| 98 | + stem = n[len(pre):] | ||
| 99 | + if pre.endswith("checksum_"): | ||
| 100 | + stem = "checksum-" + stem | ||
| 101 | + break | ||
| 102 | + else: | ||
| 103 | + stem = n | ||
| 104 | + jolt_name = stem.replace("_", "-") | ||
| 105 | + argv = " ".join(a) if a else "" | ||
| 106 | + print(f'(ffi/defcfn {jolt_name} "{n}" [{argv}] {r})') | ||