Commit 2e6bea7
feat(nodes): add S3/object store sink node via OpenDAL (#273)
* feat(nodes): add S3/object store sink node via OpenDAL
Add ObjectStoreWriteNode — a new sink node that streams Binary packets
to S3-compatible object storage using Apache OpenDAL. Supports AWS S3,
MinIO, RustFS, GCS, Azure Blob, and other S3-compatible backends.
Key design:
- Multipart upload via OpenDAL Writer with configurable chunk size
(default 5 MiB) for bounded memory usage
- Credentials resolved from env vars (precedence) or inline config,
following the RTMP node's stream_key_env pattern
- Full state lifecycle: Initializing → Running → Stopped/Failed
- Tracing at each stage for runtime debugging
- Behind opt-in 'object_store' feature flag (not in default)
Includes:
- 3 sample pipelines (TTS→S3, transcode→S3, MoQ+S3 archive)
- docker-compose.rustfs.yml for local E2E validation with RustFS
- 8 unit tests covering pins, factory validation, credential
resolution, and state transitions
Signed-off-by: Devin AI <devin@devin.ai>
Signed-off-by: StreamKit Devin <devin@streamkit.dev>
Co-Authored-By: Claudio Costa <cstcld91@gmail.com>
* fix(nodes): fix close() failure path in object store writer
- Remove double state emission (emit_failed + emit_stopped) on close
failure — only emit_failed, matching every other error path in the
codebase and avoiding spurious Failed→Stopped state sequence.
- Add writer.abort() on close() failure to clean up orphaned multipart
uploads, matching the write-error paths.
Signed-off-by: Devin AI <devin@devin.ai>
Signed-off-by: StreamKit Devin <devin@streamkit.dev>
Co-Authored-By: Claudio Costa <cstcld91@gmail.com>
* fix(nodes): address review findings for object store writer
- Add AbortOnDrop guard to abort orphaned multipart uploads on task
cancellation (critical: prevents storage leaks)
- Replace drain().collect() with split_off + mem::replace for zero-copy
chunk extraction
- Validate endpoint, bucket, and key are non-empty in factory (fail-fast
instead of runtime S3 errors)
- Refactor resolve_credential to accept an env lookup closure, eliminating
unsound std::env::set_var calls in tests
- Inline reason string at use site (remove early allocation)
- Add comment about static key limitation in moq_s3_archive.yml
- Add tests for empty endpoint/bucket/key factory validation
Signed-off-by: StreamKit Devin <devin@streamkit.dev>
Co-Authored-By: Claudio Costa <cstcld91@gmail.com>
* style: cargo fmt
Signed-off-by: StreamKit Devin <devin@streamkit.dev>
Co-Authored-By: Claudio Costa <cstcld91@gmail.com>
* refactor: move docker-compose.rustfs.yml to docker/
Per review feedback — docker/ is a better home than repo root since
this is useful beyond just e2e/playwright testing.
Signed-off-by: StreamKit Devin <devin@streamkit.dev>
Co-Authored-By: Claudio Costa <cstcld91@gmail.com>
---------
Signed-off-by: Devin AI <devin@devin.ai>
Signed-off-by: StreamKit Devin <devin@streamkit.dev>
Co-authored-by: StreamKit Devin <devin@streamkit.dev>
Co-authored-by: Claudio Costa <cstcld91@gmail.com>1 parent daa53f7 commit 2e6bea7
File tree
8 files changed
+1253
-12
lines changed- crates/nodes
- src/core
- docker
- samples/pipelines
- dynamic
- oneshot
8 files changed
+1253
-12
lines changedSome generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
96 | 96 | | |
97 | 97 | | |
98 | 98 | | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
99 | 104 | | |
100 | 105 | | |
101 | 106 | | |
| |||
167 | 172 | | |
168 | 173 | | |
169 | 174 | | |
| 175 | + | |
170 | 176 | | |
171 | 177 | | |
172 | 178 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
10 | 10 | | |
11 | 11 | | |
12 | 12 | | |
| 13 | + | |
| 14 | + | |
13 | 15 | | |
14 | 16 | | |
15 | 17 | | |
| |||
190 | 192 | | |
191 | 193 | | |
192 | 194 | | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
193 | 214 | | |
0 commit comments