134 lines
3.3 KiB
Markdown
134 lines
3.3 KiB
Markdown
# ShittyServerless Execution Instance 🛠️
|
|
|
|
**A lightweight Node.js server for executing serverless functions locally or via S3 storage.**
|
|
|
|
This project allows developers to deploy and run serverless functions by simply placing files in a storage backend (local filesystem or S3/MinIO). It handles streaming headers, request data, and safe child process execution.
|
|
|
|
Most notable use being ChattedRooms' newest API rendition.
|
|
|
|
---
|
|
|
|
## Features ✨
|
|
|
|
- Execute serverless functions in **Python, Node.js, or Bash** automatically.
|
|
- Supports **local filesystem** or **S3-compatible storage** (e.g., AWS S3, MinIO).
|
|
- **Safe child process execution** with timeout handling.
|
|
- **Streaming response support** with header parsing and body streaming.
|
|
- Flexible **file lookup by extension** or brute-force search.
|
|
- Easy integration with **existing serverless workflows**.
|
|
|
|
---
|
|
|
|
## Prerequisites 📝
|
|
|
|
- Node.js v18+
|
|
- NPM (Node Package Manager)
|
|
- Optional: AWS credentials and S3 bucket if not using local storage
|
|
|
|
---
|
|
|
|
## Installation ⚡
|
|
|
|
1. Clone the repository:
|
|
|
|
```bash
|
|
git clone https://github.com/yourusername/shitty-serverless.git
|
|
cd shitty-serverless
|
|
```
|
|
|
|
2. Install dependencies:
|
|
|
|
```bash
|
|
npm install
|
|
```
|
|
|
|
3. Configure your environment by editing `config.sample.js` and then renaming it to `config.js`:
|
|
|
|
```bash
|
|
cp config.sample.js config.js
|
|
# Then edit config.js to match your setup
|
|
```
|
|
|
|
> ⚠️ Using local storage is **not recommended for production**.
|
|
|
|
---
|
|
|
|
## Usage 🚀
|
|
|
|
1. Start the server:
|
|
|
|
```bash
|
|
node index.js
|
|
```
|
|
|
|
2. Open your browser or use `curl`:
|
|
|
|
```bash
|
|
curl http://localhost:3000/yourFunction.py
|
|
```
|
|
|
|
- The server will attempt to execute the requested file if it exists in storage.
|
|
- Supported file extensions:
|
|
- `.sh` → Bash
|
|
- `.py` → Python 3
|
|
- `.js` → Node.js
|
|
|
|
3. If the requested file does not exist, the server will try a **brute-force search** by appending supported extensions.
|
|
|
|
---
|
|
|
|
## Example Function (Python) 🐍
|
|
|
|
```python
|
|
import json
|
|
import sys
|
|
|
|
print("Content-Type: application/json")
|
|
|
|
req = json.loads(input('!!RECVDATA').strip()) # You can only ask for JSON data before body output
|
|
|
|
print("!!STARTBODY", end="") # No newline, avoids blank line before body
|
|
print(json.dumps(req), end="") # Echo back request data
|
|
|
|
sys.exit(2) # Exit code 2 means 403 Forbidden, but here it is just an example
|
|
```
|
|
|
|
- Place this file in `localstorage/` or S3 bucket.
|
|
- Request via HTTP:
|
|
|
|
```bash
|
|
curl http://localhost:3000/example.py
|
|
```
|
|
|
|
- Response will include headers and body streamed directly from the function.
|
|
|
|
---
|
|
|
|
## Exit Code Mapping 📊
|
|
|
|
The server maps child process exit codes to HTTP status codes:
|
|
|
|
| Exit Code | HTTP Status |
|
|
|-----------|-------------|
|
|
| 0 | 200 OK |
|
|
| 1 | 500 Internal Server Error |
|
|
| 2 | 403 Forbidden |
|
|
| 3 | 401 Unauthorized |
|
|
| 4 | 404 Not Found |
|
|
|
|
Other codes default to **500 Internal Server Error**.
|
|
|
|
---
|
|
|
|
## Development Tips 💡
|
|
|
|
- For **debugging**, all child process `stdout` and `stderr` are logged to the server console.
|
|
- Ensure your serverless scripts **emit the `!!STARTBODY` token** to separate headers from body content.
|
|
- Use `!!RECVDATA` in scripts to access the incoming HTTP request object.
|
|
|
|
---
|
|
|
|
## License 🛡️
|
|
|
|
This project is provided **as-is**, without warranty. Use at your own risk.
|