# local_text_output

A RocketRide target node that writes pipeline text output to the local filesystem as `.txt` files.

## What it does

Receives text arriving on its `text` lane and saves each source object as a `.txt` file under a configured output directory, preserving the source directory structure. Text is accumulated per object while the object is open and flushed in a single UTF-8 write when the object closes. This is a sink node with no output lane.

Uses only the Python standard library (`os`) with no external dependencies.

The node is restricted to self-hosted deployments (capability `nosaas`). It also carries the `filesystem` and `security` capabilities.

Safety behavior that applies to every object:

- Objects that failed upstream (`objectFailed`) are skipped entirely.
- A path-traversal guard rejects any resolved target path that escapes the configured output directory.
- Directory creation failures and write errors log a warning and skip the object rather than failing the whole pipeline.
- Files are only written when the accumulated text is non-empty.
- If `storePath` is not set, every object is skipped with a warning.

---

## Configuration

### Lanes

| Lane in | Description                   |
| ------- | ----------------------------- |
| `text`  | Text content to write to disk |

No output lanes: this is a terminal (target) node.

### Fields

Both fields live under the node's `parameters` key (shown as "Destination path" in the UI).

| Field | Type | Description |
|---|---|---|
| `exclude` | string | Default "N/A". Which paths to exclude from the output path, if not required put N/A. e.g Users/Downloads/ or N/A |

On Windows, config validation rejects a `storePath` or `exclude` value that contains any of the characters `< > : " / | ? *`. An `exclude` value of `N/A` is exempt from this check.

---

## Output path resolution

For each object the target file path is constructed from the object's source path:

1. If `exclude` is `N/A`, the full source path is used as the relative sub-path. Otherwise the `exclude` prefix is stripped from the source path. If the source path does not start with the `exclude` prefix, the node logs a warning and skips the object.
2. The source file extension is replaced with `.txt` (for example, `Hackathon/folder1/report.pdf` becomes `Hackathon/folder1/report.txt`).
3. The relative path is joined under `storePath` (for example, `/Users/username/Desktop/Hackathon/folder1/report.txt`). The fully resolved path must remain inside `storePath`; any path that escapes it is rejected with a path-traversal error.
4. All necessary subdirectories are created automatically before the file is written.

---

<!-- ROCKETRIDE:GENERATED:PARAMS START -->
<!-- Generated by nodes:docs-generate. Do not edit by hand. -->

## Schema

| Field | Type | Description | Default |
|---|---|---|---|
| `local_text_output.exclude` | `string` | **exclude**<br/>Which paths to exclude from the output path, if not required put N/A. e.g Users/Downloads/ or N/A | `"N/A"` |

## Source

[<svg viewBox="0 0 16 16" width="15" height="15" fill="currentColor" aria-hidden="true" style="vertical-align:-0.15em;margin-right:0.35em"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z"/></svg> View source](https://github.com/rocketride-org/rocketride-server/tree/develop/nodes/src/nodes/local_text_output)
<!-- ROCKETRIDE:GENERATED:PARAMS END -->
