ServerlessWorkflow.Sdk 0.8.8

dotnet add package ServerlessWorkflow.Sdk --version 0.8.8
NuGet\Install-Package ServerlessWorkflow.Sdk -Version 0.8.8
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="ServerlessWorkflow.Sdk" Version="0.8.8" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add ServerlessWorkflow.Sdk --version 0.8.8
#r "nuget: ServerlessWorkflow.Sdk, 0.8.8"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install ServerlessWorkflow.Sdk as a Cake Addin
#addin nuget:?package=ServerlessWorkflow.Sdk&version=0.8.8

// Install ServerlessWorkflow.Sdk as a Cake Tool
#tool nuget:?package=ServerlessWorkflow.Sdk&version=0.8.8

Publish Packages Gitpod ready-to-code

Serverless Workflow Specification - .NET SDK

Provides .NET 7.0 API/SPI and Model Validation for the Serverless Workflow Specification

With the SDK, you can:

  • Read and write workflow JSON and YAML definitions
  • Programmatically build workflow definitions
  • Validate workflow definitions (both schema and DSL integrity validation)

Status

Latest Releases Conformance to spec version
0.8.7 0.8

Getting Started

dotnet nuget add package ServerlessWorkflow.Sdk
services.AddServerlessWorkflow();

Usage

Build workflows programatically
var workflow = WorkflowDefinition.Create("MyWorkflow", "MyWorkflow", "1.0")
  .StartsWith("inject", flow => 
      flow.Inject(new { username = "test", password = "123456" }))
  .Then("operation", flow =>
      flow.Execute("fakeApiFunctionCall", action =>
      {
          action.Invoke(function =>
              function.WithName("fakeFunction")
                  .SetOperationUri(new Uri("https://fake.com/swagger.json#fake")))
              .WithArgument("username", "${ .username }")
              .WithArgument("password", "${ .password }");
      })      
          .Execute("fakeEventTrigger", action =>
          {
               action
                    .Consume(e =>
                        e.WithName("fakeEvent")
                            .WithSource(new Uri("https://fakesource.com"))
                            .WithType("fakeType"))
                    .ThenProduce(e =>
                        e.WithName("otherEvent")
                            .WithSource(new Uri("https://fakesource.com"))
                            .WithType("fakeType"));
          }))
  .End()
  .Build();
Read workflows
var reader = WorkflowReader.Create();
using(Stream stream = File.OpenRead("myWorkflow.json"))
{
  var definition = reader.Read(stream, WorkflowDefinitionFormat.Json);
}
Write workflows
  var writer = WorkflowWriter.Create();
  using(Stream stream = new MemoryStream())
  {
      writer.Write(workflow, stream);
      stream.Flush();
      stream.Position = 0;
      using(StreamReader reader = new StreamReader(stream))
      {
          var yaml = reader.ReadToEnd();
          Console.WriteLine(yaml);
          Console.ReadLine();
      }
  }
Validate workflows
var validator = serviceProvider.GetRequiredService<IValidator<WorkflowDefinition>>();
var validationResult = validator.Validate(myWorkflow);
Extend Workflows

The SDK allows extending the Serverless Workflow in two ways, possibly combined: via metadata and via extensions.

Metadata

Workflow components that support metadata, such as WorkflowDefinition or StateDefinition, expose a metadata property, which is a dynamic name/value mapping of properties used to enrich the serverless workflow model with information beyond its core definitions.

It has the advantage of being an easy, cross-compatible way of declaring additional data, but lacks well-defined, well-documented schema of the data, thus loosing the ability to validate it without custom implementation.

Adding metadata to a workflow:

var workflow = new WorkflowBuilder()
    ...
    .WithMetadata(new Dictionary<string, object>() { { "metadataPropertyName", metadataPropertyValue } })
    ...
    .Build();

Resulting workflow:

id: sample-workflow
version: 1.0.0
specVersion: 0.8
metadata:
  metadataPropertyName: metadataPropertyValue #added to the metadata property of supporting components
...
Extension

Users have the ability to define extensions, providing the ability to extend, override or replace parts of the Serverless Workflow schema.

To do so, you must first create a file containing the JsonSchema of your extension, then reference it in your workflow definition.

Schema of a sample extension that adds a new greet functionType: <table> <tr> <th>JSON</th> <th>YAML</th> </tr> <tr> <td valign="top">

{
  "$defs": {
    "functions": {
      "definitions": {
        "function": {
          "type": "object",
          "properties": {
            "type": {
              "type": "string",
              "description": "Defines the function type. Is either `rest`, `asyncapi, `rpc`, `graphql`, `odata`, `expression` or `greet`. Default is `rest`",
              "enum": [
                "rest",
                "asyncapi",
                "rpc",
                "graphql",
                "odata",
                "expression",
                "custom",
                "greet"
              ],
              "default": "rest"
            }
          }
        }
      }
    }
  }
}

</td>

<td valign="top">

'$defs':
  functions:
    definitions:
      function:
        type: object
        properties:
          type:
            type: string
            description: Defines the function type. Is either `rest`, `asyncapi, `rpc`,
              `graphql`, `odata`, `expression` or `greet`. Default is `rest`
            enum:
            - rest
            - asyncapi
            - rpc
            - graphql
            - odata
            - expression
            - custom
            - greet
            default: rest

</td> </tr> </table>

The above example refers to /$defs/functions, because upon validation the SDK bundles all the Serverless Workflow Specification's schemas into the $defs property of a single schema.

*In this case, functions is the extensionless name of the schema file we want to override (https://serverlessworkflow.io/schemas/latest/functions.json).

A Json Merge Patch is performed sequentially on the bundled schema with the defined extensions, in declaring order.

In this case, the above schema will patch the object defined at /functions/definitions/function in file https://serverlessworkflow.io/schemas/latest/functions.json

Extending a workflow:

var workflow = new WorkflowBuilder()
    .WithId("sample-extended")
    .WithName("Sample Extended Workflow")
    .WithVersion("1.0.0")
    .UseSpecVersion(ServerlessWorkflowSpecVersion.V08)
    .UseExtension("extensionId", new Uri("file://.../extensions/greet-function-type.json"))
    .StartsWith("do-work", flow => flow.Execute("greet", action => action
        .Invoke(function => function
            .OfType("greet")
            .WithName("greet")
            .ForOperation("#"))))
    .End()
    .Build();

Adding extension properties:

var workflow = new WorkflowBuilder()
    ...
    .WithExtensionProperty("extensionPropertyName", propertyValue } })
    ...
    .Build();

Resulting workflow:

id: sample-workflow
version: 1.0.0
specVersion: 0.8
extensionPropertyName: propertyValue #added as top level property of extended component, as opposed to metadata
...
Product Compatible and additional computed target framework versions.
.NET net7.0 is compatible.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (1)

Showing the top 1 NuGet packages that depend on ServerlessWorkflow.Sdk:

Package Downloads
Synapse.Integration

This package contains everything you need to integrate Synapse WFMS and its APIs

GitHub repositories (1)

Showing the top 1 popular GitHub repositories that depend on ServerlessWorkflow.Sdk:

Repository Stars
serverlessworkflow/synapse
Serverless Workflow Management System (WFMS)
Version Downloads Last updated
0.8.8 161 1/4/2024
0.8.7 772 6/29/2023
0.8.6 334 11/30/2022
0.8.5 318 11/18/2022
0.8.4 13,188 11/4/2022
0.8.3 7,202 10/26/2022
0.8.2 372 9/30/2022
0.8.1.16 4,178 9/28/2022
0.8.1.15 1,516 9/22/2022
0.8.1.14 3,490 9/9/2022
0.8.1.13 389 9/7/2022
0.8.1.12 377 9/7/2022
0.8.1.11 5,738 8/30/2022
0.8.1.10 2,536 8/23/2022
0.8.1.9 419 8/23/2022
0.8.1.8 3,654 8/11/2022
0.8.1.7 1,489 8/9/2022
0.8.1.6 1,651 5/20/2022
0.8.1.5 408 5/20/2022
0.8.1.4 449 5/18/2022
0.8.1.3 411 5/17/2022
0.8.1.2 429 5/17/2022
0.8.1.1 387 5/17/2022
0.8.1 393 5/16/2022
0.8.0.22 401 5/16/2022
0.8.0.21 495 5/10/2022
0.8.0.20 618 4/14/2022
0.8.0.19 564 4/14/2022
0.8.0.18 415 4/14/2022
0.8.0.17 442 4/13/2022
0.8.0.16 411 4/13/2022
0.8.0.15 552 3/7/2022
0.8.0.14 396 3/7/2022
0.8.0.13 433 3/3/2022
0.8.0.12 408 3/2/2022
0.8.0.11 422 2/25/2022
0.8.0.10 431 2/24/2022
0.8.0.9 436 2/24/2022
0.8.0.8 404 2/23/2022
0.8.0.7 398 2/23/2022
0.8.0.6 413 2/22/2022
0.8.0.5 394 2/21/2022
0.8.0.4 404 2/21/2022
0.8.0.3 418 2/18/2022
0.8.0.2 410 2/15/2022
0.8.0.1 412 2/14/2022
0.8.0 432 2/14/2022
0.7.4.4 364 7/2/2021
0.7.4.3 342 7/2/2021
0.7.4.2 292 7/2/2021
0.7.4.1 274 7/1/2021
0.7.4 316 7/1/2021
0.7.3 289 6/16/2021
0.7.2 334 6/8/2021
0.7.1 334 6/3/2021
0.7.0 284 6/2/2021
0.6.3 339 5/27/2021
0.6.2 315 5/27/2021
0.6.1 770 4/19/2021
0.6.0 351 4/3/2021