mirror of
https://github.com/extism/extism.git
synced 2026-04-23 03:00:11 -04:00
EIP: https://github.com/extism/proposals/pull/8 This PR makes minor breaking changes to several SDKs, but not to runtime C API. The threadsafety updates in the Rust SDK are kind of specific to Rust, I'm not sure if it makes sense to add the locks to all the other SDKs at this point. For the most part the `Context` and `Plugin` types in the SDKs should be safe to use protected by a mutex but they aren't inherently threadsafe. That kind of locking should probably be done by the user. - Runtime - improve thread safety - reinstantiates less - fixes a potential resource exhaustion bug from re-instantiating using the same store too many times - Rust SDK - adds `Send` and `Sync` implementations for `Context` - adds test sharing a context between threads - adds `Plugin::call_map` to call a plugin and handle the output with the lock held - adds testing sharing an `Arc<Mutex<Plugin>>` between threads - adds `Plugin::create` and `Plugin::create_from_manifest` to create a plugin without a `Context` - Python - BREAKING - changes `Plugin` constructor to take `context` as an optional named argument, to update use `Plugin(data, context=context)` instead - Ruby - BREAKING - changes `Plugin` constructor to take `context` as an optional named argument, to update use `Plugin.new(data, context=context)` instead - Go - adds `NewPlugin` and `NewPluginFromManifest` functions - Node - BREAKING - changes `Plugin` constructor to take `context` as an optional named argument, to update use `new Plugin(data, wasi, config, host, context)` instead of `new Plugin(context, data, wasi, functions, config)` (most people are probably using `context.plugin` instead of the Plugin constructor anyway) - OCaml - BREAKING - changes `Plugin.create` and `Plugin.of_manifest` to take `context` as an optional named argument, to update `Plugin.create ~context data` and `Plugin.of_manifest ~context data` instead - Haskell - adds `createPlugin` and `createPluginFromManifest` functions - Elixir - adds `Plugin.new` to make a plugin without going through `Context.new_plugin` - Java - adds new `Plugin` constructors without a `Context` argument - C++ - BREAKING - Updates `Plugin` constructor to take an optional context as the last argument, instead of requiring it to be the first argument - Use `Plugin(wasm, wasi, functions, ctx)` instead of `Plugin(ctx, wasm, wasi, functions)` - Zig - Adds `Plugin.create` and `Plugin.createWithManifest` to create plugins in their own context. --------- Co-authored-by: zach <zach@dylib.so> Co-authored-by: Benjamin Eckel <bhelx@simst.im>
28 lines
904 B
OCaml
28 lines
904 B
OCaml
open Extism
|
|
open Cmdliner
|
|
|
|
let read_stdin () = In_channel.input_all stdin
|
|
|
|
let main file func_name input =
|
|
let input = if String.equal input "-" then read_stdin () else input in
|
|
let file = In_channel.with_open_bin file In_channel.input_all in
|
|
let plugin = Plugin.create file ~wasi:true |> Result.get_ok in
|
|
let res = Plugin.call plugin ~name:func_name input |> Result.get_ok in
|
|
print_endline res
|
|
|
|
let file =
|
|
let doc = "The WASM module or Extism manifest path." in
|
|
Arg.(value & pos 0 file "" & info [] ~docv:"FILE" ~doc)
|
|
|
|
let func_name =
|
|
let doc = "The function to run." in
|
|
Arg.(value & pos 1 string "_start" & info [] ~docv:"NAME" ~doc)
|
|
|
|
let input =
|
|
let doc = "Input data." in
|
|
Arg.(value & opt string "" & info [ "input"; "i" ] ~docv:"INPUT" ~doc)
|
|
|
|
let main_t = Term.(const main $ file $ func_name $ input)
|
|
let cmd = Cmd.v (Cmd.info "extism-run") main_t
|
|
let () = exit (Cmd.eval cmd)
|