<html lang="en">
<head></head>
<body>

<form id="mainForm" method="post" action="https://stackblitz.com/run" target="_self">
<input type="hidden" name="project[files][.gitignore]" value=".actorcore
node_modules
">
<input type="hidden" name="project[files][README.md]" value="# Order Fulfillment State Machine for RivetKit

Example project demonstrating a basic order state machine with [RivetKit](https://rivetkit.org).

[Learn More →](https://github.com/rivet-dev/rivetkit)

[Discord](https://rivet.dev/discord) — [Documentation](https://rivetkit.org) — [Issues](https://github.com/rivet-dev/rivetkit/issues)

## Getting Started

### Prerequisites

- Node.js

### Installation

```sh
git clone https://github.com/rivet-dev/rivetkit
cd rivetkit/examples/workflows
npm install
```

### Development

```sh
npm run dev
```

Once the registry starts, the terminal prints the manager endpoint and inspector URL. Connect to `orderWorkflow` with any order ID (for example `order-123`), provide creation input like `{ &quot;customer&quot;: &quot;Acme Corp&quot; }`, then use `advance` to step through the fulfillment stages and `getNextStatus` to see which state comes next.

## License

Apache 2.0
">
<input type="hidden" name="project[files][package.json]" value="{&quot;name&quot;:&quot;example-workflows&quot;,&quot;version&quot;:&quot;2.0.20&quot;,&quot;private&quot;:true,&quot;type&quot;:&quot;module&quot;,&quot;scripts&quot;:{&quot;dev&quot;:&quot;tsx src/server.ts&quot;,&quot;check-types&quot;:&quot;tsc --noEmit&quot;,&quot;test&quot;:&quot;vitest run&quot;},&quot;devDependencies&quot;:{&quot;rivetkit&quot;:&quot;https://pkg.pr.new/rivet-dev/rivetkit/rivetkit@54999214372f9ecb3f4251a3be45c7a0eb8dfacf&quot;,&quot;@types/node&quot;:&quot;^22.13.9&quot;,&quot;tsx&quot;:&quot;^3.12.7&quot;,&quot;typescript&quot;:&quot;^5.7.3&quot;,&quot;vitest&quot;:&quot;^3.1.1&quot;},&quot;stableVersion&quot;:&quot;0.8.0&quot;}">
<input type="hidden" name="project[files][tsconfig.json]" value="{
  &quot;compilerOptions&quot;: {
    /* Visit https://aka.ms/tsconfig.json to read more about this file */

    /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
    &quot;target&quot;: &quot;esnext&quot;,
    /* Specify a set of bundled library declaration files that describe the target runtime environment. */
    &quot;lib&quot;: [&quot;esnext&quot;],
    /* Specify what JSX code is generated. */
    &quot;jsx&quot;: &quot;react-jsx&quot;,

    /* Specify what module code is generated. */
    &quot;module&quot;: &quot;esnext&quot;,
    /* Specify how TypeScript looks up a file from a given module specifier. */
    &quot;moduleResolution&quot;: &quot;bundler&quot;,
    /* Specify type package names to be included without being referenced in a source file. */
    &quot;types&quot;: [&quot;node&quot;],
    /* Enable importing .json files */
    &quot;resolveJsonModule&quot;: true,

    /* Allow JavaScript files to be a part of your program. Use the `checkJS` option to get errors from these files. */
    &quot;allowJs&quot;: true,
    /* Enable error reporting in type-checked JavaScript files. */
    &quot;checkJs&quot;: false,

    /* Disable emitting files from a compilation. */
    &quot;noEmit&quot;: true,

    /* Ensure that each file can be safely transpiled without relying on other imports. */
    &quot;isolatedModules&quot;: true,
    /* Allow &#39;import x from y&#39; when a module doesn&#39;t have a default export. */
    &quot;allowSyntheticDefaultImports&quot;: true,
    /* Ensure that casing is correct in imports. */
    &quot;forceConsistentCasingInFileNames&quot;: true,

    /* Enable all strict type-checking options. */
    &quot;strict&quot;: true,

    /* Skip type checking all .d.ts files. */
    &quot;skipLibCheck&quot;: true
  },
  &quot;include&quot;: [&quot;src/**/*.ts&quot;, &quot;scripts/**/*.ts&quot;, &quot;tests/**/*.ts&quot;]
}
">
<input type="hidden" name="project[files][turbo.json]" value="{
  &quot;$schema&quot;: &quot;https://turbo.build/schema.json&quot;,
  &quot;extends&quot;: [&quot;//&quot;]
}
">
<input type="hidden" name="project[files][src/registry.ts]" value="import { actor, setup, UserError } from &quot;rivetkit&quot;;
import { assertUnreachable } from &quot;rivetkit/utils&quot;;
import type { Order, OrderInput } from &quot;./types&quot;;

const orderWorkflow = actor({
	createState: (c, input): Order =&gt; ({
		id: c.actorId,
		customer: (input as OrderInput).customer,
		state: &quot;pending&quot;,
		createdAt: Date.now(),
		updatedAt: Date.now(),
	}),
	actions: {
		advance: (c) =&gt; {
			switch (c.state.state) {
				case &quot;pending&quot;:
					// Execute durable operation here
					c.state.state = &quot;packed&quot;;
					break;
				case &quot;packed&quot;:
					// Execute durable operation here
					c.state.state = &quot;shipped&quot;;
					break;
				case &quot;shipped&quot;:
					// Execute durable operation here
					c.state.state = &quot;delivered&quot;;
					break;
				case &quot;delivered&quot;:
					// Execute durable operation here
					throw new UserError(&quot;order already delivered&quot;, {
						code: &quot;order_complete&quot;,
					});
				default:
					assertUnreachable(c.state.state);
			}

			c.state.updatedAt = Date.now();

			c.broadcast(&quot;orderAdvanced&quot;, c.state);

			return c.state;
		},

		getOrder: (c) =&gt; c.state,
	},
});

export const registry = setup({
	use: { orderWorkflow },
});

export type Registry = typeof registry;
">
<input type="hidden" name="project[files][src/server.ts]" value="import { registry } from &quot;./registry&quot;;

registry.start();
">
<input type="hidden" name="project[files][src/types.ts]" value="export type OrderStatus = &quot;pending&quot; | &quot;packed&quot; | &quot;shipped&quot; | &quot;delivered&quot;;

export type OrderInput = {
	customer: string;
};

export type Order = {
	id: string;
	customer: string;
	state: OrderStatus;
	createdAt: number;
	updatedAt: number;
};

export const orderFlow: readonly OrderStatus[] = [
	&quot;pending&quot;,
	&quot;packed&quot;,
	&quot;shipped&quot;,
	&quot;delivered&quot;,
];
">
<input type="hidden" name="project[description]" value="generated by https://pkg.pr.new">
<input type="hidden" name="project[template]" value="node">
<input type="hidden" name="project[title]" value="example-workflows">
</form>
<script>document.getElementById("mainForm").submit();</script>

</body></html>