flingit 0.0.63 → 0.0.65
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/commands/dev.d.ts.map +1 -1
- package/dist/cli/commands/dev.js +9 -5
- package/dist/cli/commands/dev.js.map +1 -1
- package/dist/cli/commands/workflow.d.ts +51 -0
- package/dist/cli/commands/workflow.d.ts.map +1 -0
- package/dist/cli/commands/workflow.js +479 -0
- package/dist/cli/commands/workflow.js.map +1 -0
- package/dist/cli/deploy/bundler.d.ts.map +1 -1
- package/dist/cli/deploy/bundler.js +17 -1
- package/dist/cli/deploy/bundler.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/runtime/entry.d.ts +7 -0
- package/dist/runtime/entry.d.ts.map +1 -1
- package/dist/runtime/entry.js +71 -2
- package/dist/runtime/entry.js.map +1 -1
- package/dist/types/workflow.d.ts +82 -0
- package/dist/types/workflow.d.ts.map +1 -0
- package/dist/types/workflow.js +8 -0
- package/dist/types/workflow.js.map +1 -0
- package/dist/worker-runtime/d1-event-store.d.ts +22 -0
- package/dist/worker-runtime/d1-event-store.d.ts.map +1 -0
- package/dist/worker-runtime/d1-event-store.js +227 -0
- package/dist/worker-runtime/d1-event-store.js.map +1 -0
- package/dist/worker-runtime/entry-extract.d.ts.map +1 -1
- package/dist/worker-runtime/entry-extract.js +6 -3
- package/dist/worker-runtime/entry-extract.js.map +1 -1
- package/dist/worker-runtime/entry.d.ts.map +1 -1
- package/dist/worker-runtime/entry.js +105 -3
- package/dist/worker-runtime/entry.js.map +1 -1
- package/dist/worker-runtime/index.d.ts +2 -0
- package/dist/worker-runtime/index.d.ts.map +1 -1
- package/dist/worker-runtime/index.js +5 -0
- package/dist/worker-runtime/index.js.map +1 -1
- package/dist/workflow/runtime.d.ts +56 -0
- package/dist/workflow/runtime.d.ts.map +1 -0
- package/dist/workflow/runtime.js +450 -0
- package/dist/workflow/runtime.js.map +1 -0
- package/node_modules/@glideapps/ts-necessities/LICENSE +21 -0
- package/node_modules/@glideapps/ts-necessities/README.md +16 -0
- package/node_modules/@glideapps/ts-necessities/dist/branded-strings.d.ts +39 -0
- package/node_modules/@glideapps/ts-necessities/dist/default-map.d.ts +53 -0
- package/node_modules/@glideapps/ts-necessities/dist/index.d.mts +113 -0
- package/node_modules/@glideapps/ts-necessities/dist/index.d.ts +113 -0
- package/node_modules/@glideapps/ts-necessities/dist/index.js +237 -0
- package/node_modules/@glideapps/ts-necessities/dist/index.mjs +189 -0
- package/node_modules/@glideapps/ts-necessities/package.json +52 -0
- package/node_modules/@rollup/rollup-linux-x64-gnu/README.md +3 -0
- package/node_modules/@rollup/rollup-linux-x64-gnu/package.json +25 -0
- package/node_modules/@rollup/rollup-linux-x64-gnu/rollup.linux-x64-gnu.node +0 -0
- package/node_modules/base64-js/LICENSE +21 -0
- package/node_modules/base64-js/README.md +34 -0
- package/node_modules/base64-js/base64js.min.js +1 -0
- package/node_modules/base64-js/index.d.ts +3 -0
- package/node_modules/base64-js/index.js +150 -0
- package/node_modules/base64-js/package.json +47 -0
- package/node_modules/better-sqlite3/LICENSE +21 -0
- package/node_modules/better-sqlite3/README.md +99 -0
- package/node_modules/better-sqlite3/binding.gyp +38 -0
- package/node_modules/better-sqlite3/deps/common.gypi +68 -0
- package/node_modules/better-sqlite3/deps/copy.js +31 -0
- package/node_modules/better-sqlite3/deps/defines.gypi +41 -0
- package/node_modules/better-sqlite3/deps/download.sh +122 -0
- package/node_modules/better-sqlite3/deps/patches/1208.patch +15 -0
- package/node_modules/better-sqlite3/deps/sqlite3/sqlite3.c +265994 -0
- package/node_modules/better-sqlite3/deps/sqlite3/sqlite3.h +13968 -0
- package/node_modules/better-sqlite3/deps/sqlite3/sqlite3ext.h +730 -0
- package/node_modules/better-sqlite3/deps/sqlite3.gyp +80 -0
- package/node_modules/better-sqlite3/deps/test_extension.c +21 -0
- package/node_modules/better-sqlite3/lib/database.js +90 -0
- package/node_modules/better-sqlite3/lib/index.js +3 -0
- package/node_modules/better-sqlite3/lib/methods/aggregate.js +43 -0
- package/node_modules/better-sqlite3/lib/methods/backup.js +67 -0
- package/node_modules/better-sqlite3/lib/methods/function.js +31 -0
- package/node_modules/better-sqlite3/lib/methods/inspect.js +7 -0
- package/node_modules/better-sqlite3/lib/methods/pragma.js +12 -0
- package/node_modules/better-sqlite3/lib/methods/serialize.js +16 -0
- package/node_modules/better-sqlite3/lib/methods/table.js +189 -0
- package/node_modules/better-sqlite3/lib/methods/transaction.js +78 -0
- package/node_modules/better-sqlite3/lib/methods/wrappers.js +54 -0
- package/node_modules/better-sqlite3/lib/sqlite-error.js +20 -0
- package/node_modules/better-sqlite3/lib/util.js +12 -0
- package/node_modules/better-sqlite3/package.json +59 -0
- package/node_modules/better-sqlite3/src/addon.cpp +47 -0
- package/node_modules/better-sqlite3/src/better_sqlite3.cpp +74 -0
- package/node_modules/better-sqlite3/src/objects/backup.cpp +120 -0
- package/node_modules/better-sqlite3/src/objects/backup.hpp +36 -0
- package/node_modules/better-sqlite3/src/objects/database.cpp +417 -0
- package/node_modules/better-sqlite3/src/objects/database.hpp +103 -0
- package/node_modules/better-sqlite3/src/objects/statement-iterator.cpp +113 -0
- package/node_modules/better-sqlite3/src/objects/statement-iterator.hpp +50 -0
- package/node_modules/better-sqlite3/src/objects/statement.cpp +383 -0
- package/node_modules/better-sqlite3/src/objects/statement.hpp +58 -0
- package/node_modules/better-sqlite3/src/util/bind-map.cpp +73 -0
- package/node_modules/better-sqlite3/src/util/binder.cpp +193 -0
- package/node_modules/better-sqlite3/src/util/constants.cpp +172 -0
- package/node_modules/better-sqlite3/src/util/custom-aggregate.cpp +121 -0
- package/node_modules/better-sqlite3/src/util/custom-function.cpp +59 -0
- package/node_modules/better-sqlite3/src/util/custom-table.cpp +409 -0
- package/node_modules/better-sqlite3/src/util/data-converter.cpp +17 -0
- package/node_modules/better-sqlite3/src/util/data.cpp +194 -0
- package/node_modules/better-sqlite3/src/util/helpers.cpp +109 -0
- package/node_modules/better-sqlite3/src/util/macros.cpp +83 -0
- package/node_modules/better-sqlite3/src/util/query-macros.cpp +71 -0
- package/node_modules/better-sqlite3/src/util/row-builder.cpp +49 -0
- package/node_modules/bindings/LICENSE.md +22 -0
- package/node_modules/bindings/README.md +98 -0
- package/node_modules/bindings/bindings.js +221 -0
- package/node_modules/bindings/package.json +28 -0
- package/node_modules/bl/.travis.yml +17 -0
- package/node_modules/bl/BufferList.js +396 -0
- package/node_modules/bl/LICENSE.md +13 -0
- package/node_modules/bl/README.md +247 -0
- package/node_modules/bl/bl.js +84 -0
- package/node_modules/bl/package.json +37 -0
- package/node_modules/bl/test/convert.js +21 -0
- package/node_modules/bl/test/indexOf.js +492 -0
- package/node_modules/bl/test/isBufferList.js +32 -0
- package/node_modules/bl/test/test.js +869 -0
- package/node_modules/buffer/AUTHORS.md +70 -0
- package/node_modules/buffer/LICENSE +21 -0
- package/node_modules/buffer/README.md +410 -0
- package/node_modules/buffer/index.d.ts +186 -0
- package/node_modules/buffer/index.js +1817 -0
- package/node_modules/buffer/package.json +96 -0
- package/node_modules/chownr/LICENSE +15 -0
- package/node_modules/chownr/README.md +3 -0
- package/node_modules/chownr/chownr.js +167 -0
- package/node_modules/chownr/package.json +29 -0
- package/node_modules/decompress-response/index.d.ts +22 -0
- package/node_modules/decompress-response/index.js +58 -0
- package/node_modules/decompress-response/license +9 -0
- package/node_modules/decompress-response/package.json +56 -0
- package/node_modules/decompress-response/readme.md +48 -0
- package/node_modules/deep-extend/LICENSE +20 -0
- package/node_modules/deep-extend/README.md +91 -0
- package/node_modules/deep-extend/index.js +1 -0
- package/node_modules/deep-extend/lib/deep-extend.js +150 -0
- package/node_modules/deep-extend/package.json +62 -0
- package/node_modules/detect-libc/LICENSE +201 -0
- package/node_modules/detect-libc/README.md +163 -0
- package/node_modules/detect-libc/index.d.ts +14 -0
- package/node_modules/detect-libc/lib/detect-libc.js +313 -0
- package/node_modules/detect-libc/lib/elf.js +39 -0
- package/node_modules/detect-libc/lib/filesystem.js +51 -0
- package/node_modules/detect-libc/lib/process.js +24 -0
- package/node_modules/detect-libc/package.json +44 -0
- package/node_modules/determined/LICENSE +18 -0
- package/node_modules/determined/README.md +317 -0
- package/node_modules/determined/dist/index.cjs +370 -0
- package/node_modules/determined/dist/index.d.cts +110 -0
- package/node_modules/determined/dist/index.d.ts +110 -0
- package/node_modules/determined/dist/index.js +332 -0
- package/node_modules/determined/package.json +45 -0
- package/node_modules/end-of-stream/LICENSE +21 -0
- package/node_modules/end-of-stream/README.md +54 -0
- package/node_modules/end-of-stream/index.js +96 -0
- package/node_modules/end-of-stream/package.json +37 -0
- package/node_modules/expand-template/.travis.yml +6 -0
- package/node_modules/expand-template/LICENSE +21 -0
- package/node_modules/expand-template/README.md +43 -0
- package/node_modules/expand-template/index.js +26 -0
- package/node_modules/expand-template/package.json +29 -0
- package/node_modules/expand-template/test.js +67 -0
- package/node_modules/file-uri-to-path/.npmignore +1 -0
- package/node_modules/file-uri-to-path/.travis.yml +30 -0
- package/node_modules/file-uri-to-path/History.md +21 -0
- package/node_modules/file-uri-to-path/LICENSE +20 -0
- package/node_modules/file-uri-to-path/README.md +74 -0
- package/node_modules/file-uri-to-path/index.d.ts +2 -0
- package/node_modules/file-uri-to-path/index.js +66 -0
- package/node_modules/file-uri-to-path/package.json +32 -0
- package/node_modules/file-uri-to-path/test/test.js +24 -0
- package/node_modules/file-uri-to-path/test/tests.json +13 -0
- package/node_modules/flingflow/.nvmrc +1 -0
- package/node_modules/flingflow/AGENTS.md +5 -0
- package/node_modules/flingflow/README.md +679 -0
- package/node_modules/flingflow/SPEC.md +554 -0
- package/node_modules/flingflow/TESTING.md +506 -0
- package/node_modules/flingflow/dist/backoff.d.ts +9 -0
- package/node_modules/flingflow/dist/backoff.js +14 -0
- package/node_modules/flingflow/dist/backoff.js.map +1 -0
- package/node_modules/flingflow/dist/clock.d.ts +13 -0
- package/node_modules/flingflow/dist/clock.js +21 -0
- package/node_modules/flingflow/dist/clock.js.map +1 -0
- package/node_modules/flingflow/dist/context.d.ts +8 -0
- package/node_modules/flingflow/dist/context.js +45 -0
- package/node_modules/flingflow/dist/context.js.map +1 -0
- package/node_modules/flingflow/dist/engine.d.ts +29 -0
- package/node_modules/flingflow/dist/engine.js +306 -0
- package/node_modules/flingflow/dist/engine.js.map +1 -0
- package/node_modules/flingflow/dist/index.d.ts +18 -0
- package/node_modules/flingflow/dist/index.js +14 -0
- package/node_modules/flingflow/dist/index.js.map +1 -0
- package/node_modules/flingflow/dist/recovery.d.ts +16 -0
- package/node_modules/flingflow/dist/recovery.js +118 -0
- package/node_modules/flingflow/dist/recovery.js.map +1 -0
- package/node_modules/flingflow/dist/registry.d.ts +24 -0
- package/node_modules/flingflow/dist/registry.js +29 -0
- package/node_modules/flingflow/dist/registry.js.map +1 -0
- package/node_modules/flingflow/dist/store-memory.d.ts +29 -0
- package/node_modules/flingflow/dist/store-memory.js +349 -0
- package/node_modules/flingflow/dist/store-memory.js.map +1 -0
- package/node_modules/flingflow/dist/store-sqlite.d.ts +30 -0
- package/node_modules/flingflow/dist/store-sqlite.js +400 -0
- package/node_modules/flingflow/dist/store-sqlite.js.map +1 -0
- package/node_modules/flingflow/dist/store.d.ts +39 -0
- package/node_modules/flingflow/dist/store.js +21 -0
- package/node_modules/flingflow/dist/store.js.map +1 -0
- package/node_modules/flingflow/dist/stress.d.ts +1 -0
- package/node_modules/flingflow/dist/stress.js +377 -0
- package/node_modules/flingflow/dist/stress.js.map +1 -0
- package/node_modules/flingflow/dist/transitions.d.ts +14 -0
- package/node_modules/flingflow/dist/transitions.js +28 -0
- package/node_modules/flingflow/dist/transitions.js.map +1 -0
- package/node_modules/flingflow/dist/types.d.ts +114 -0
- package/node_modules/flingflow/dist/types.js +10 -0
- package/node_modules/flingflow/dist/types.js.map +1 -0
- package/node_modules/flingflow/eslint.config.js +94 -0
- package/node_modules/flingflow/package.json +66 -0
- package/node_modules/flingflow/src/backoff.ts +14 -0
- package/node_modules/flingflow/src/clock.ts +29 -0
- package/node_modules/flingflow/src/context.ts +60 -0
- package/node_modules/flingflow/src/engine.ts +367 -0
- package/node_modules/flingflow/src/index.ts +52 -0
- package/node_modules/flingflow/src/recovery.ts +144 -0
- package/node_modules/flingflow/src/registry.ts +52 -0
- package/node_modules/flingflow/src/store-memory.ts +378 -0
- package/node_modules/flingflow/src/store-sqlite.ts +451 -0
- package/node_modules/flingflow/src/store.ts +55 -0
- package/node_modules/flingflow/src/stress.ts +423 -0
- package/node_modules/flingflow/src/transitions.ts +38 -0
- package/node_modules/flingflow/src/types.ts +84 -0
- package/node_modules/flingflow/test/backoff.test.ts +54 -0
- package/node_modules/flingflow/test/context.test.ts +94 -0
- package/node_modules/flingflow/test/engine.test.ts +362 -0
- package/node_modules/flingflow/test/fixtures.ts +58 -0
- package/node_modules/flingflow/test/recovery.test.ts +176 -0
- package/node_modules/flingflow/test/simulation.test.ts +395 -0
- package/node_modules/flingflow/test/store-conformance.ts +344 -0
- package/node_modules/flingflow/test/store-memory.test.ts +8 -0
- package/node_modules/flingflow/test/store-sqlite.test.ts +8 -0
- package/node_modules/flingflow/tsconfig.json +18 -0
- package/node_modules/flingflow/tsconfig.lint.json +5 -0
- package/node_modules/flingflow/tsconfig.typecheck.json +20 -0
- package/node_modules/flingflow/vitest.config.ts +10 -0
- package/node_modules/fs-constants/LICENSE +21 -0
- package/node_modules/fs-constants/README.md +26 -0
- package/node_modules/fs-constants/browser.js +1 -0
- package/node_modules/fs-constants/index.js +1 -0
- package/node_modules/fs-constants/package.json +19 -0
- package/node_modules/github-from-package/.travis.yml +4 -0
- package/node_modules/github-from-package/LICENSE +18 -0
- package/node_modules/github-from-package/example/package.json +8 -0
- package/node_modules/github-from-package/example/url.js +3 -0
- package/node_modules/github-from-package/index.js +17 -0
- package/node_modules/github-from-package/package.json +30 -0
- package/node_modules/github-from-package/readme.markdown +53 -0
- package/node_modules/github-from-package/test/a.json +8 -0
- package/node_modules/github-from-package/test/b.json +5 -0
- package/node_modules/github-from-package/test/c.json +5 -0
- package/node_modules/github-from-package/test/d.json +7 -0
- package/node_modules/github-from-package/test/e.json +5 -0
- package/node_modules/github-from-package/test/url.js +19 -0
- package/node_modules/ieee754/LICENSE +11 -0
- package/node_modules/ieee754/README.md +51 -0
- package/node_modules/ieee754/index.d.ts +10 -0
- package/node_modules/ieee754/index.js +85 -0
- package/node_modules/ieee754/package.json +52 -0
- package/node_modules/inherits/LICENSE +16 -0
- package/node_modules/inherits/README.md +42 -0
- package/node_modules/inherits/inherits.js +9 -0
- package/node_modules/inherits/inherits_browser.js +27 -0
- package/node_modules/inherits/package.json +29 -0
- package/node_modules/ini/LICENSE +15 -0
- package/node_modules/ini/README.md +102 -0
- package/node_modules/ini/ini.js +206 -0
- package/node_modules/ini/package.json +33 -0
- package/node_modules/mimic-response/index.d.ts +17 -0
- package/node_modules/mimic-response/index.js +77 -0
- package/node_modules/mimic-response/license +9 -0
- package/node_modules/mimic-response/package.json +42 -0
- package/node_modules/mimic-response/readme.md +78 -0
- package/node_modules/minimist/.eslintrc +29 -0
- package/node_modules/minimist/.github/FUNDING.yml +12 -0
- package/node_modules/minimist/.nycrc +14 -0
- package/node_modules/minimist/CHANGELOG.md +298 -0
- package/node_modules/minimist/LICENSE +18 -0
- package/node_modules/minimist/README.md +121 -0
- package/node_modules/minimist/example/parse.js +4 -0
- package/node_modules/minimist/index.js +263 -0
- package/node_modules/minimist/package.json +75 -0
- package/node_modules/minimist/test/all_bool.js +34 -0
- package/node_modules/minimist/test/bool.js +177 -0
- package/node_modules/minimist/test/dash.js +43 -0
- package/node_modules/minimist/test/default_bool.js +37 -0
- package/node_modules/minimist/test/dotted.js +24 -0
- package/node_modules/minimist/test/kv_short.js +32 -0
- package/node_modules/minimist/test/long.js +33 -0
- package/node_modules/minimist/test/num.js +38 -0
- package/node_modules/minimist/test/parse.js +209 -0
- package/node_modules/minimist/test/parse_modified.js +11 -0
- package/node_modules/minimist/test/proto.js +64 -0
- package/node_modules/minimist/test/short.js +69 -0
- package/node_modules/minimist/test/stop_early.js +17 -0
- package/node_modules/minimist/test/unknown.js +104 -0
- package/node_modules/minimist/test/whitespace.js +10 -0
- package/node_modules/mkdirp-classic/LICENSE +21 -0
- package/node_modules/mkdirp-classic/README.md +18 -0
- package/node_modules/mkdirp-classic/index.js +98 -0
- package/node_modules/mkdirp-classic/package.json +18 -0
- package/node_modules/napi-build-utils/.github/workflows/run-npm-tests.yml +31 -0
- package/node_modules/napi-build-utils/LICENSE +21 -0
- package/node_modules/napi-build-utils/README.md +52 -0
- package/node_modules/napi-build-utils/index.js +214 -0
- package/node_modules/napi-build-utils/index.md +0 -0
- package/node_modules/napi-build-utils/package.json +42 -0
- package/node_modules/neverthrow/LICENSE +22 -0
- package/node_modules/neverthrow/README.md +1683 -0
- package/node_modules/neverthrow/dist/index.cjs.js +510 -0
- package/node_modules/neverthrow/dist/index.d.ts +408 -0
- package/node_modules/neverthrow/dist/index.es.js +497 -0
- package/node_modules/neverthrow/package.json +64 -0
- package/node_modules/node-abi/LICENSE +21 -0
- package/node_modules/node-abi/README.md +54 -0
- package/node_modules/node-abi/abi_registry.json +425 -0
- package/node_modules/node-abi/index.js +179 -0
- package/node_modules/node-abi/package.json +45 -0
- package/node_modules/once/LICENSE +15 -0
- package/node_modules/once/README.md +79 -0
- package/node_modules/once/once.js +42 -0
- package/node_modules/once/package.json +33 -0
- package/node_modules/prebuild-install/CHANGELOG.md +131 -0
- package/node_modules/prebuild-install/CONTRIBUTING.md +6 -0
- package/node_modules/prebuild-install/LICENSE +21 -0
- package/node_modules/prebuild-install/README.md +163 -0
- package/node_modules/prebuild-install/asset.js +44 -0
- package/node_modules/prebuild-install/bin.js +78 -0
- package/node_modules/prebuild-install/download.js +142 -0
- package/node_modules/prebuild-install/error.js +14 -0
- package/node_modules/prebuild-install/help.txt +16 -0
- package/node_modules/prebuild-install/index.js +1 -0
- package/node_modules/prebuild-install/log.js +33 -0
- package/node_modules/prebuild-install/package.json +67 -0
- package/node_modules/prebuild-install/proxy.js +35 -0
- package/node_modules/prebuild-install/rc.js +64 -0
- package/node_modules/prebuild-install/util.js +143 -0
- package/node_modules/pump/.github/FUNDING.yml +2 -0
- package/node_modules/pump/.travis.yml +5 -0
- package/node_modules/pump/LICENSE +21 -0
- package/node_modules/pump/README.md +74 -0
- package/node_modules/pump/SECURITY.md +5 -0
- package/node_modules/pump/index.js +86 -0
- package/node_modules/pump/package.json +24 -0
- package/node_modules/pump/test-browser.js +66 -0
- package/node_modules/pump/test-node.js +53 -0
- package/node_modules/rc/LICENSE.APACHE2 +15 -0
- package/node_modules/rc/LICENSE.BSD +26 -0
- package/node_modules/rc/LICENSE.MIT +24 -0
- package/node_modules/rc/README.md +227 -0
- package/node_modules/rc/browser.js +7 -0
- package/node_modules/rc/cli.js +4 -0
- package/node_modules/rc/index.js +53 -0
- package/node_modules/rc/lib/utils.js +104 -0
- package/node_modules/rc/package.json +29 -0
- package/node_modules/rc/test/ini.js +16 -0
- package/node_modules/rc/test/nested-env-vars.js +50 -0
- package/node_modules/rc/test/test.js +59 -0
- package/node_modules/readable-stream/CONTRIBUTING.md +38 -0
- package/node_modules/readable-stream/GOVERNANCE.md +136 -0
- package/node_modules/readable-stream/LICENSE +47 -0
- package/node_modules/readable-stream/README.md +106 -0
- package/node_modules/readable-stream/errors-browser.js +127 -0
- package/node_modules/readable-stream/errors.js +116 -0
- package/node_modules/readable-stream/experimentalWarning.js +17 -0
- package/node_modules/readable-stream/lib/_stream_duplex.js +126 -0
- package/node_modules/readable-stream/lib/_stream_passthrough.js +37 -0
- package/node_modules/readable-stream/lib/_stream_readable.js +1027 -0
- package/node_modules/readable-stream/lib/_stream_transform.js +190 -0
- package/node_modules/readable-stream/lib/_stream_writable.js +641 -0
- package/node_modules/readable-stream/lib/internal/streams/async_iterator.js +180 -0
- package/node_modules/readable-stream/lib/internal/streams/buffer_list.js +183 -0
- package/node_modules/readable-stream/lib/internal/streams/destroy.js +96 -0
- package/node_modules/readable-stream/lib/internal/streams/end-of-stream.js +86 -0
- package/node_modules/readable-stream/lib/internal/streams/from-browser.js +3 -0
- package/node_modules/readable-stream/lib/internal/streams/from.js +52 -0
- package/node_modules/readable-stream/lib/internal/streams/pipeline.js +86 -0
- package/node_modules/readable-stream/lib/internal/streams/state.js +22 -0
- package/node_modules/readable-stream/lib/internal/streams/stream-browser.js +1 -0
- package/node_modules/readable-stream/lib/internal/streams/stream.js +1 -0
- package/node_modules/readable-stream/package.json +68 -0
- package/node_modules/readable-stream/readable-browser.js +9 -0
- package/node_modules/readable-stream/readable.js +16 -0
- package/node_modules/safe-buffer/LICENSE +21 -0
- package/node_modules/safe-buffer/README.md +584 -0
- package/node_modules/safe-buffer/index.d.ts +187 -0
- package/node_modules/safe-buffer/index.js +65 -0
- package/node_modules/safe-buffer/package.json +51 -0
- package/node_modules/semver/LICENSE +15 -0
- package/node_modules/semver/README.md +664 -0
- package/node_modules/semver/bin/semver.js +191 -0
- package/node_modules/semver/classes/comparator.js +143 -0
- package/node_modules/semver/classes/index.js +7 -0
- package/node_modules/semver/classes/range.js +557 -0
- package/node_modules/semver/classes/semver.js +333 -0
- package/node_modules/semver/functions/clean.js +8 -0
- package/node_modules/semver/functions/cmp.js +54 -0
- package/node_modules/semver/functions/coerce.js +62 -0
- package/node_modules/semver/functions/compare-build.js +9 -0
- package/node_modules/semver/functions/compare-loose.js +5 -0
- package/node_modules/semver/functions/compare.js +7 -0
- package/node_modules/semver/functions/diff.js +60 -0
- package/node_modules/semver/functions/eq.js +5 -0
- package/node_modules/semver/functions/gt.js +5 -0
- package/node_modules/semver/functions/gte.js +5 -0
- package/node_modules/semver/functions/inc.js +21 -0
- package/node_modules/semver/functions/lt.js +5 -0
- package/node_modules/semver/functions/lte.js +5 -0
- package/node_modules/semver/functions/major.js +5 -0
- package/node_modules/semver/functions/minor.js +5 -0
- package/node_modules/semver/functions/neq.js +5 -0
- package/node_modules/semver/functions/parse.js +18 -0
- package/node_modules/semver/functions/patch.js +5 -0
- package/node_modules/semver/functions/prerelease.js +8 -0
- package/node_modules/semver/functions/rcompare.js +5 -0
- package/node_modules/semver/functions/rsort.js +5 -0
- package/node_modules/semver/functions/satisfies.js +12 -0
- package/node_modules/semver/functions/sort.js +5 -0
- package/node_modules/semver/functions/valid.js +8 -0
- package/node_modules/semver/index.js +91 -0
- package/node_modules/semver/internal/constants.js +37 -0
- package/node_modules/semver/internal/debug.js +11 -0
- package/node_modules/semver/internal/identifiers.js +29 -0
- package/node_modules/semver/internal/lrucache.js +42 -0
- package/node_modules/semver/internal/parse-options.js +17 -0
- package/node_modules/semver/internal/re.js +223 -0
- package/node_modules/semver/package.json +78 -0
- package/node_modules/semver/preload.js +4 -0
- package/node_modules/semver/range.bnf +16 -0
- package/node_modules/semver/ranges/gtr.js +6 -0
- package/node_modules/semver/ranges/intersects.js +9 -0
- package/node_modules/semver/ranges/ltr.js +6 -0
- package/node_modules/semver/ranges/max-satisfying.js +27 -0
- package/node_modules/semver/ranges/min-satisfying.js +26 -0
- package/node_modules/semver/ranges/min-version.js +63 -0
- package/node_modules/semver/ranges/outside.js +82 -0
- package/node_modules/semver/ranges/simplify.js +49 -0
- package/node_modules/semver/ranges/subset.js +249 -0
- package/node_modules/semver/ranges/to-comparators.js +10 -0
- package/node_modules/semver/ranges/valid.js +13 -0
- package/node_modules/simple-concat/.travis.yml +3 -0
- package/node_modules/simple-concat/LICENSE +20 -0
- package/node_modules/simple-concat/README.md +44 -0
- package/node_modules/simple-concat/index.js +15 -0
- package/node_modules/simple-concat/package.json +47 -0
- package/node_modules/simple-concat/test/basic.js +41 -0
- package/node_modules/simple-get/.github/dependabot.yml +15 -0
- package/node_modules/simple-get/.github/workflows/ci.yml +23 -0
- package/node_modules/simple-get/LICENSE +20 -0
- package/node_modules/simple-get/README.md +333 -0
- package/node_modules/simple-get/index.js +108 -0
- package/node_modules/simple-get/package.json +67 -0
- package/node_modules/string_decoder/LICENSE +48 -0
- package/node_modules/string_decoder/README.md +47 -0
- package/node_modules/string_decoder/lib/string_decoder.js +296 -0
- package/node_modules/string_decoder/package.json +34 -0
- package/node_modules/strip-json-comments/index.js +70 -0
- package/node_modules/strip-json-comments/license +21 -0
- package/node_modules/strip-json-comments/package.json +42 -0
- package/node_modules/strip-json-comments/readme.md +64 -0
- package/node_modules/tar-fs/.travis.yml +6 -0
- package/node_modules/tar-fs/LICENSE +21 -0
- package/node_modules/tar-fs/README.md +165 -0
- package/node_modules/tar-fs/index.js +363 -0
- package/node_modules/tar-fs/package.json +41 -0
- package/node_modules/tar-fs/test/fixtures/a/hello.txt +1 -0
- package/node_modules/tar-fs/test/fixtures/b/a/test.txt +1 -0
- package/node_modules/tar-fs/test/fixtures/d/file1 +0 -0
- package/node_modules/tar-fs/test/fixtures/d/file2 +0 -0
- package/node_modules/tar-fs/test/fixtures/d/sub-dir/file5 +0 -0
- package/node_modules/tar-fs/test/fixtures/d/sub-files/file3 +0 -0
- package/node_modules/tar-fs/test/fixtures/d/sub-files/file4 +0 -0
- package/node_modules/tar-fs/test/fixtures/e/directory/.ignore +0 -0
- package/node_modules/tar-fs/test/fixtures/e/file +0 -0
- package/node_modules/tar-fs/test/fixtures/invalid.tar +0 -0
- package/node_modules/tar-fs/test/index.js +346 -0
- package/node_modules/tar-stream/LICENSE +21 -0
- package/node_modules/tar-stream/README.md +168 -0
- package/node_modules/tar-stream/extract.js +257 -0
- package/node_modules/tar-stream/headers.js +295 -0
- package/node_modules/tar-stream/index.js +2 -0
- package/node_modules/tar-stream/pack.js +255 -0
- package/node_modules/tar-stream/package.json +58 -0
- package/node_modules/tar-stream/sandbox.js +11 -0
- package/node_modules/tunnel-agent/LICENSE +55 -0
- package/node_modules/tunnel-agent/README.md +4 -0
- package/node_modules/tunnel-agent/index.js +244 -0
- package/node_modules/tunnel-agent/package.json +22 -0
- package/node_modules/util-deprecate/History.md +16 -0
- package/node_modules/util-deprecate/LICENSE +24 -0
- package/node_modules/util-deprecate/README.md +53 -0
- package/node_modules/util-deprecate/browser.js +67 -0
- package/node_modules/util-deprecate/node.js +6 -0
- package/node_modules/util-deprecate/package.json +27 -0
- package/node_modules/wrappy/LICENSE +15 -0
- package/node_modules/wrappy/README.md +36 -0
- package/node_modules/wrappy/package.json +29 -0
- package/node_modules/wrappy/wrappy.js +33 -0
- package/package.json +12 -2
- package/templates/default/dot-claude/skills/fling/.hash +1 -1
- package/templates/default/dot-claude/skills/fling/SKILL.md +56 -29
- package/templates/default/dot-claude/skills/fling/references/WORKFLOWS.md +368 -0
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
# Workflows
|
|
2
|
+
|
|
3
|
+
Durable multi-step workflows with automatic retries and scratchpad state. Workflows survive server restarts — progress is persisted to the database after every step. Errors are automatically retried with exponential backoff up to `maxAttempts` (default 5), unless thrown as `NonRetryableError`.
|
|
4
|
+
|
|
5
|
+
## Quick Start
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
import { app, workflow, type WorkflowContinuation, type WorkflowCtx, NonRetryableError } from "flingit";
|
|
9
|
+
|
|
10
|
+
// 1. Register workflow at module top-level
|
|
11
|
+
workflow("onboarding", {
|
|
12
|
+
async start(ctx: WorkflowCtx): Promise<WorkflowContinuation> {
|
|
13
|
+
const email = await ctx.get("email") as string;
|
|
14
|
+
const name = await ctx.get("name") as string;
|
|
15
|
+
const id = await db.prepare("INSERT INTO users (email, name) VALUES (?, ?) RETURNING id")
|
|
16
|
+
.bind(email, name).first<{ id: number }>();
|
|
17
|
+
ctx.set("userId", id!.id);
|
|
18
|
+
return { step: "sendWelcome" };
|
|
19
|
+
},
|
|
20
|
+
|
|
21
|
+
async sendWelcome(ctx: WorkflowCtx): Promise<WorkflowContinuation> {
|
|
22
|
+
const userId = await ctx.get("userId") as number;
|
|
23
|
+
await sendWelcomeEmail(userId);
|
|
24
|
+
return { step: "provision" };
|
|
25
|
+
},
|
|
26
|
+
|
|
27
|
+
async provision(ctx: WorkflowCtx): Promise<WorkflowContinuation> {
|
|
28
|
+
const userId = await ctx.get("userId") as number;
|
|
29
|
+
const workspace = await createWorkspace(userId);
|
|
30
|
+
return { done: true, result: { userId, workspaceId: workspace.id } };
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
// 2. Start from a route handler (fire-and-forget)
|
|
35
|
+
app.post("/api/signup", async (c) => {
|
|
36
|
+
const body = await c.req.json();
|
|
37
|
+
const run = await workflow.start("onboarding", body);
|
|
38
|
+
return c.json({ runId: run.runId, status: "accepted" });
|
|
39
|
+
});
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Defining Workflows
|
|
43
|
+
|
|
44
|
+
Register workflows at module top-level (like `cron` and `migrate`). Each workflow has a unique name and a set of named step handlers.
|
|
45
|
+
|
|
46
|
+
```typescript
|
|
47
|
+
import { workflow, type WorkflowContinuation, type WorkflowCtx } from "flingit";
|
|
48
|
+
|
|
49
|
+
workflow("my-workflow", {
|
|
50
|
+
async start(ctx: WorkflowCtx): Promise<WorkflowContinuation> {
|
|
51
|
+
// ... do work ...
|
|
52
|
+
return { step: "stepTwo" }; // advance to next step
|
|
53
|
+
},
|
|
54
|
+
|
|
55
|
+
async stepTwo(ctx: WorkflowCtx): Promise<WorkflowContinuation> {
|
|
56
|
+
// ... do work ...
|
|
57
|
+
return { done: true, result: { success: true } }; // complete the workflow
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
The first step must be named `start` — the engine always begins there. Each step must return a `WorkflowContinuation`:
|
|
63
|
+
|
|
64
|
+
```typescript
|
|
65
|
+
// Advance to another step
|
|
66
|
+
return { step: "next-step-name" };
|
|
67
|
+
|
|
68
|
+
// Complete the workflow with a result
|
|
69
|
+
return { done: true, result: { orderId: 123 } };
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## WorkflowCtx
|
|
73
|
+
|
|
74
|
+
Every step handler receives a context object:
|
|
75
|
+
|
|
76
|
+
```typescript
|
|
77
|
+
interface WorkflowCtx {
|
|
78
|
+
workflowId: string; // User-provided logical workflow identity
|
|
79
|
+
runId: string; // System-generated unique run ID
|
|
80
|
+
step: string; // Current step name
|
|
81
|
+
get(key: string): Promise<unknown>; // Read from scratchpad
|
|
82
|
+
set(key: string, value: unknown): void; // Buffer a write to scratchpad
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
- `workflowId` is either the `id` you provided in `start()` options or an auto-generated UUID.
|
|
87
|
+
- `runId` is a system-generated UUID unique to this execution.
|
|
88
|
+
|
|
89
|
+
## Scratchpad
|
|
90
|
+
|
|
91
|
+
Use `ctx.set()` and `ctx.get()` to pass data between steps:
|
|
92
|
+
|
|
93
|
+
```typescript
|
|
94
|
+
async charge(ctx: WorkflowCtx): Promise<WorkflowContinuation> {
|
|
95
|
+
const orderId = await ctx.get("orderId") as string;
|
|
96
|
+
const chargeId = await processPayment(orderId);
|
|
97
|
+
ctx.set("chargeId", chargeId); // buffer a write
|
|
98
|
+
return { step: "ship" };
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
async ship(ctx: WorkflowCtx): Promise<WorkflowContinuation> {
|
|
102
|
+
const chargeId = await ctx.get("chargeId") as string; // read previous value
|
|
103
|
+
await scheduleShipment(chargeId);
|
|
104
|
+
return { done: true, result: { shipped: true } };
|
|
105
|
+
}
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
**Persistence semantics:**
|
|
109
|
+
- Writes are buffered during step execution and persisted atomically when the step succeeds.
|
|
110
|
+
- If a step throws, all writes from that step are discarded.
|
|
111
|
+
- Values must be JSON-serializable.
|
|
112
|
+
- `ctx.get()` returns `undefined` for missing keys.
|
|
113
|
+
|
|
114
|
+
## Starting Workflows
|
|
115
|
+
|
|
116
|
+
```typescript
|
|
117
|
+
// Basic start — auto-generates a workflow ID
|
|
118
|
+
// The second argument provides initial scratchpad data (key-value pairs readable via ctx.get())
|
|
119
|
+
const run = await workflow.start("my-workflow", { key: "value" });
|
|
120
|
+
|
|
121
|
+
// With deduplication — same ID returns existing active run instead of creating a new one
|
|
122
|
+
const run = await workflow.start("my-workflow", { key: "value" }, { id: "order-42" });
|
|
123
|
+
if (!run.created) {
|
|
124
|
+
console.log("Reusing existing run:", run.runId);
|
|
125
|
+
}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
`workflow.start(name, data?, options?)` begins executing steps immediately in the background and returns a `WorkflowRun`. The `data` argument is an optional object of key-value pairs that become the initial scratchpad — each key is readable via `ctx.get()` in step handlers:
|
|
129
|
+
|
|
130
|
+
```typescript
|
|
131
|
+
interface WorkflowRun {
|
|
132
|
+
runId: string; // System-generated unique run ID
|
|
133
|
+
workflowId: string; // User-provided or auto-generated workflow ID
|
|
134
|
+
name: string; // Workflow definition name
|
|
135
|
+
status: WorkflowStatus; // "running" | "completed" | "failed"
|
|
136
|
+
created: boolean; // true if new run, false if reusing (dedup)
|
|
137
|
+
createdAt: number; // Epoch ms
|
|
138
|
+
result(): Promise<unknown>; // Wait for completion and return result
|
|
139
|
+
}
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
## Getting Results
|
|
143
|
+
|
|
144
|
+
Call `result()` on a `WorkflowRun` to wait for completion:
|
|
145
|
+
|
|
146
|
+
```typescript
|
|
147
|
+
const run = await workflow.start("order-fulfillment", { itemId: "abc", qty: 2 });
|
|
148
|
+
const outcome = await run.result();
|
|
149
|
+
// outcome = { status: "shipped", chargeId: "ch_123" }
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
`result()` throws if the workflow fails.
|
|
153
|
+
|
|
154
|
+
**Fire-and-forget:** If you don't need the result, just don't call `result()`. The workflow still runs to completion in the background.
|
|
155
|
+
|
|
156
|
+
```typescript
|
|
157
|
+
app.post("/api/enqueue", async (c) => {
|
|
158
|
+
const body = await c.req.json();
|
|
159
|
+
const run = await workflow.start("background-job", body);
|
|
160
|
+
// Don't await result — workflow runs in background
|
|
161
|
+
return c.json({ runId: run.runId, status: "accepted" });
|
|
162
|
+
});
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
## Querying
|
|
166
|
+
|
|
167
|
+
```typescript
|
|
168
|
+
// Get a specific run by run ID (returns WorkflowRun or null)
|
|
169
|
+
const run = await workflow.get(runId);
|
|
170
|
+
if (run) {
|
|
171
|
+
console.log(run.status); // "running" | "completed" | "failed"
|
|
172
|
+
const result = await run.result(); // wait if still running
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// List workflow runs with optional filters
|
|
176
|
+
const runs = await workflow.list({ name: "order-fulfillment", status: "running", limit: 10 });
|
|
177
|
+
for (const r of runs) {
|
|
178
|
+
console.log(`${r.name} [${r.status}] runId=${r.runId}`);
|
|
179
|
+
}
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
**Filter options for `workflow.list()`:**
|
|
183
|
+
|
|
184
|
+
| Field | Type | Description |
|
|
185
|
+
|-------|------|-------------|
|
|
186
|
+
| `name` | `string` | Filter by workflow definition name |
|
|
187
|
+
| `status` | `"running" \| "completed" \| "failed"` | Filter by status |
|
|
188
|
+
| `limit` | `number` | Max results (default: 100) |
|
|
189
|
+
|
|
190
|
+
## Error Handling
|
|
191
|
+
|
|
192
|
+
Use `NonRetryableError` for errors that should immediately fail the workflow without retrying. Regular throws are retried automatically with exponential backoff up to `maxAttempts`.
|
|
193
|
+
|
|
194
|
+
```typescript
|
|
195
|
+
import { NonRetryableError } from "flingit";
|
|
196
|
+
|
|
197
|
+
async function validate(ctx: WorkflowCtx): Promise<WorkflowContinuation> {
|
|
198
|
+
const qty = await ctx.get("qty") as number;
|
|
199
|
+
|
|
200
|
+
// Non-retryable: bad input will never become valid
|
|
201
|
+
if (qty <= 0) {
|
|
202
|
+
throw new NonRetryableError("Invalid quantity");
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// Regular throw: retried automatically (transient failure)
|
|
206
|
+
const res = await fetch("https://api.example.com/check");
|
|
207
|
+
if (!res.ok) {
|
|
208
|
+
throw new Error("API temporarily unavailable");
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
return { step: "next" };
|
|
212
|
+
}
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
`NonRetryableError` constructor: `new NonRetryableError(message)`
|
|
216
|
+
|
|
217
|
+
- `message` — Error message string
|
|
218
|
+
|
|
219
|
+
## Options
|
|
220
|
+
|
|
221
|
+
Pass options as the third argument to `workflow()`:
|
|
222
|
+
|
|
223
|
+
```typescript
|
|
224
|
+
workflow("my-workflow", steps, {
|
|
225
|
+
maxAttempts: 10, // Max attempts per step (default: 5)
|
|
226
|
+
initialBackoffMS: 2000, // Delay after first failure (default: 1000)
|
|
227
|
+
backoffMultiplier: 3, // Exponential multiplier (default: 2)
|
|
228
|
+
maxBackoffMS: 120000, // Backoff cap (default: 60000)
|
|
229
|
+
stepTimeoutMS: 600000, // Per-step timeout in ms (default: 300000)
|
|
230
|
+
});
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
| Option | Default | Description |
|
|
234
|
+
|--------|---------|-------------|
|
|
235
|
+
| `maxAttempts` | 5 | Maximum attempts per step before the workflow fails |
|
|
236
|
+
| `initialBackoffMS` | 1000 | Delay in ms after the first failure before retrying |
|
|
237
|
+
| `backoffMultiplier` | 2 | Multiplier applied to the backoff delay after each subsequent failure |
|
|
238
|
+
| `maxBackoffMS` | 60000 | Maximum backoff delay in ms (cap) |
|
|
239
|
+
| `stepTimeoutMS` | 300000 | Per-step timeout in milliseconds (5 minutes) |
|
|
240
|
+
|
|
241
|
+
**Exponential backoff:** Attempt 1 has no delay. After the first failure, the retry delay is `initialBackoffMS`. Each subsequent failure multiplies the delay by `backoffMultiplier`, up to `maxBackoffMS`. Formula: attempt N delay = min(initialBackoffMS * backoffMultiplier^(N-2), maxBackoffMS).
|
|
242
|
+
|
|
243
|
+
When a step exceeds `maxAttempts`, the entire workflow is marked as failed. When a step exceeds `stepTimeoutMS`, it is treated as a timed-out step and picked up by recovery.
|
|
244
|
+
|
|
245
|
+
The retry/backoff configuration is sealed into the `workflow_created` event at creation time, so changing options on the definition does not affect already-running workflows.
|
|
246
|
+
|
|
247
|
+
## Recovery
|
|
248
|
+
|
|
249
|
+
A recovery cron runs automatically every minute. It handles:
|
|
250
|
+
|
|
251
|
+
- **Timed-out steps** — Steps that exceeded `stepTimeoutMS` are retried.
|
|
252
|
+
- **Stuck workflows** — Workflows that stopped progressing (e.g., due to a server restart mid-step) are resumed from their last successful step.
|
|
253
|
+
|
|
254
|
+
No configuration needed — recovery is registered automatically when you define your first workflow.
|
|
255
|
+
|
|
256
|
+
## Best Practices
|
|
257
|
+
|
|
258
|
+
### Make steps idempotent
|
|
259
|
+
|
|
260
|
+
Steps are retried on failure or timeout. A step that has already partially completed will be re-executed from the beginning. Design steps so that running them twice produces the same result:
|
|
261
|
+
|
|
262
|
+
```typescript
|
|
263
|
+
// BAD: double-charges on retry
|
|
264
|
+
async charge(ctx) {
|
|
265
|
+
const amount = await ctx.get("amount");
|
|
266
|
+
await chargeCard(amount);
|
|
267
|
+
return { step: "ship" };
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
// GOOD: check before charging
|
|
271
|
+
async charge(ctx) {
|
|
272
|
+
const orderId = await ctx.get("orderId");
|
|
273
|
+
const amount = await ctx.get("amount");
|
|
274
|
+
const existing = await db.prepare("SELECT id FROM charges WHERE order_id = ?")
|
|
275
|
+
.bind(orderId).first();
|
|
276
|
+
if (!existing) {
|
|
277
|
+
await chargeCard(amount);
|
|
278
|
+
await db.prepare("INSERT INTO charges (order_id) VALUES (?)").bind(orderId).run();
|
|
279
|
+
}
|
|
280
|
+
return { step: "ship" };
|
|
281
|
+
}
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
### Keep scratchpad data small
|
|
285
|
+
|
|
286
|
+
Every `ctx.set()` call is persisted in the event log. Keep total scratchpad data per workflow under **1 MB**. For large blobs, write to storage instead and store only the key in the scratchpad:
|
|
287
|
+
|
|
288
|
+
```typescript
|
|
289
|
+
// BAD: storing a large blob in the scratchpad
|
|
290
|
+
ctx.set("reportData", hugeJsonObject); // Could be megabytes
|
|
291
|
+
|
|
292
|
+
// GOOD: store in R2, keep only the reference
|
|
293
|
+
await storage.put(`reports/${ctx.runId}.json`, JSON.stringify(hugeJsonObject));
|
|
294
|
+
ctx.set("reportKey", `reports/${ctx.runId}.json`);
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
### Keep steps bounded
|
|
298
|
+
|
|
299
|
+
Each step should do a bounded amount of work. If you need to process a large dataset, make each step handle a batch and continue in the next step:
|
|
300
|
+
|
|
301
|
+
```typescript
|
|
302
|
+
workflow("process-rows", {
|
|
303
|
+
async start(ctx) {
|
|
304
|
+
ctx.set("cursor", 0);
|
|
305
|
+
ctx.set("processed", 0);
|
|
306
|
+
return { step: "batch" };
|
|
307
|
+
},
|
|
308
|
+
async batch(ctx) {
|
|
309
|
+
const cursor = await ctx.get("cursor") as number;
|
|
310
|
+
const processed = await ctx.get("processed") as number;
|
|
311
|
+
const BATCH_SIZE = 100;
|
|
312
|
+
|
|
313
|
+
const { results } = await db.prepare(
|
|
314
|
+
"SELECT * FROM items WHERE id > ? ORDER BY id LIMIT ?"
|
|
315
|
+
).bind(cursor, BATCH_SIZE).all();
|
|
316
|
+
|
|
317
|
+
for (const row of results) {
|
|
318
|
+
await processItem(row);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
const newCursor = results.length > 0 ? results[results.length - 1].id : cursor;
|
|
322
|
+
ctx.set("cursor", newCursor);
|
|
323
|
+
ctx.set("processed", processed + results.length);
|
|
324
|
+
|
|
325
|
+
if (results.length < BATCH_SIZE) {
|
|
326
|
+
return { done: true, result: { total: processed + results.length } };
|
|
327
|
+
}
|
|
328
|
+
return { step: "batch" }; // continue with next batch
|
|
329
|
+
},
|
|
330
|
+
});
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
## Key Constraints
|
|
334
|
+
|
|
335
|
+
- **Register at top level** — `workflow()` must be called at module top level, not inside functions or route handlers.
|
|
336
|
+
- **Unique names** — Each workflow definition must have a unique name.
|
|
337
|
+
- **First step must be named `start`** — The flingflow engine always begins execution with the step named `start`.
|
|
338
|
+
- **Scratchpad is JSON-only** — Values passed to `ctx.set()` must be JSON-serializable.
|
|
339
|
+
- **Scratchpad is not for storing large blobs** — Use storage for large blobs. A workflow run should not write more than about 1MB of data to the scratchpad over the course of its run.
|
|
340
|
+
- **Steps should not retry failures** — The workflow system has retries built in, so steps can just throw when errors occur, and they will be retried automatically.
|
|
341
|
+
- **Workflow steps should do a finite amount of work** — Steps should not do much more than a minute's worth of work each.
|
|
342
|
+
- **No more than hundreds of steps** — A workflow execution can run hundreds, but not thousands of steps. If you need more than that, leave feedback, see `references/FEEDBACK.md`.
|
|
343
|
+
- **`_workflow_events` is reserved** — The workflow engine automatically creates and manages this table. Do not create or modify it.
|
|
344
|
+
|
|
345
|
+
## CLI Commands
|
|
346
|
+
|
|
347
|
+
Manage workflows from the command line:
|
|
348
|
+
|
|
349
|
+
```bash
|
|
350
|
+
# List recent workflow runs
|
|
351
|
+
fling workflow list # Local (reads SQLite)
|
|
352
|
+
fling workflow list --prod # Deployed (reads D1)
|
|
353
|
+
fling workflow list --limit 50 # More runs
|
|
354
|
+
|
|
355
|
+
# Show step-by-step events for a run
|
|
356
|
+
fling workflow show <runId> # Brief: event types, steps, times
|
|
357
|
+
fling workflow show <runId> -v # Verbose: includes scratchpad writes and results
|
|
358
|
+
fling workflow show <runId> --prod # Deployed run
|
|
359
|
+
|
|
360
|
+
# Start a new workflow run
|
|
361
|
+
fling workflow start <name> # No initial data
|
|
362
|
+
fling workflow start <name> --input '{"key":"val"}' # Initial scratchpad data (JSON)
|
|
363
|
+
fling workflow start <name> --input - < data.json # Data from stdin
|
|
364
|
+
fling workflow start <name> --id my-dedup-key # Custom ID for deduplication
|
|
365
|
+
fling workflow start <name> --prod # Start on deployed worker
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
Local commands require `fling dev` to be running (for `start`). Use `--port` if the dev server runs on a non-default port.
|