# PsiTransfer Notes This document records the PsiTransfer behavior inferred from the local source at `/tmp/psitransfer`. It is intentionally narrow and only covers what was needed for the Thunderbird Filelink provider minimal v1 upload path. ## Confirmed upload flow 1. PsiTransfer exposes upload-related frontend config from `GET /config.json`. Source: `/tmp/psitransfer/lib/endpoints.js:133-158` 2. PsiTransfer protects both `GET /config.json` and the upload mount with the `x-passwd` header when `uploadPass` is configured. Source: `/tmp/psitransfer/lib/endpoints.js:134-142` `/tmp/psitransfer/lib/endpoints.js:420-428` 3. The upload mount is `${config.uploadAppPath}files`. Source: `/tmp/psitransfer/lib/endpoints.js:418-419` 4. PsiTransfer uses tus semantics for upload creation and patching. Source: `/tmp/psitransfer/lib/endpoints.js:479-552` `/tmp/psitransfer/lib/tusboy/handlers/post.js` `/tmp/psitransfer/lib/tusboy/handlers/patch.js` 5. On upload creation, PsiTransfer expects `Upload-Metadata` to include at least: - `name` - `sid` - `retention` Optional metadata observed in the frontend or server path: - `password` - `comment` - `type` Source: `/tmp/psitransfer/lib/endpoints.js:480-531` `/tmp/psitransfer/app/src/Upload/store/upload.js:133-151` 6. PsiTransfer generates a random per-file key server-side and uses `sid++key` as the upload identifier. Source: `/tmp/psitransfer/lib/endpoints.js:506-531` 7. After all uploads in a bucket complete, the PsiTransfer frontend issues `PATCH /files/:sid?lock=yes`. Source: `/tmp/psitransfer/app/src/Upload/store/upload.js:242-245` `/tmp/psitransfer/lib/endpoints.js:440-446` 8. The user-facing share URL is the bucket URL `/`, not the raw file URL under `/files/...`. Source: `/tmp/psitransfer/app/src/Upload/store/upload.js:42-44` `/tmp/psitransfer/lib/endpoints.js:199-246` 9. The PsiTransfer frontend remembers the `Location` header from the tus `POST` response and then reuses that upload URL for the file PATCHes. Source: `/tmp/psitransfer/app/src/Upload/store/upload.js:145-167` `/tmp/psitransfer/lib/tusboy/handlers/post.js:1-73` 10. PsiTransfer stores the upload resource at `/files/++` and responds to tus `POST` with a relative `Location` header under the upload mount. Source: `/tmp/psitransfer/lib/tusboy/handlers/post.js:49-73` `/tmp/psitransfer/lib/endpoints.js:506-531` ## Confirmed configuration semantics - Default configuration uses `baseUrl: "/"` and `uploadAppPath: "/"`, then normalizes `uploadAppPath` relative to `baseUrl`. Source: `/tmp/psitransfer/config.js:9-14` `/tmp/psitransfer/config.js:36-46` `/tmp/psitransfer/config.js:86-89` - `config.json` does not include `uploadAppPath`, so a client cannot discover a non-default upload subpath from that endpoint alone. Source: `/tmp/psitransfer/lib/endpoints.js:145-155` `/tmp/psitransfer/config.js:11-13` `/tmp/psitransfer/config.js:86-89` - Default retention is `"604800"` and supported retention values come from `config.retentions`. Source: `/tmp/psitransfer/config.js:25-34` `/tmp/psitransfer/config.js:39-42` `/tmp/psitransfer/lib/endpoints.js:148-155` `/tmp/psitransfer/lib/endpoints.js:488-490` - The PsiTransfer frontend supports an explicit bucket id through the `sid` query parameter. Source: `/tmp/psitransfer/README.md:28` `/tmp/psitransfer/app/src/Upload/store/upload.js:20-30` ## Confirmed download/share hints relevant to Thunderbird - Bucket JSON is available at `/.json` and includes per-item URLs under `/files/++`. Source: `/tmp/psitransfer/lib/endpoints.js:199-238` - Password-protected buckets are a real server-side concern; Thunderbird template hints can likely use `download_password_protected`. Source: `/tmp/psitransfer/lib/endpoints.js:212-225` - One-time retention is implemented server-side and can map to Thunderbird `download_limit: 1`. Source: `/tmp/psitransfer/config.js:25-34` `/tmp/psitransfer/lib/endpoints.js:294-300` `/tmp/psitransfer/lib/endpoints.js:392-395` ## Not yet established - A stable public delete endpoint for previously uploaded files suitable for Thunderbird `onFileDeleted`. - A stable public rename endpoint suitable for Thunderbird `onFileRename`. - Whether the Thunderbird provider should upload one file per bucket or group related files into a shared bucket. PsiTransfer is bucket-oriented, while Thunderbird `cloudFile` uploads are file-oriented. - Whether Thunderbird MV3 background scripts expose every browser primitive expected by the vendored `tus-js-client` bundle in all supported Thunderbird versions. The current implementation assumes the vendored bundle runs in the background context. ## Implemented minimal-v1 mapping - Thunderbird configuration drives `baseUrl`, `uploadAppPath`, `defaultRetention`, and the optional upload password header. - The provider probes `GET /config.json` before upload to validate retention, max file size, and bucket-password requirements. - The provider uses the vendored `vendor/tus.js` bundle for the tus `POST` and `PATCH` flow. - After the tus upload completes, the provider sends `PATCH /files/?lock=yes`. - The provider returns the bucket share URL `/` and Thunderbird `templateInfo` hints for retention and one-time downloads. ## Implementation guidance - Treat tus behavior as standard transport behavior, not a PsiTransfer-specific API by itself. - Treat the bucket lock `PATCH ...?lock=yes` as PsiTransfer-specific behavior. - Treat Thunderbird `cloudFile` event handling and return objects as a separate concern from the PsiTransfer transport. - Prefer a minimal first implementation: configure endpoint, upload a single file, return the bucket share URL, and stop there until delete or rename support is proven.