Showing preview only (683K chars total). Download the full file or copy to clipboard to get everything.
Repository: roadrunner-server/roadrunner
Branch: master
Commit: e41e6474026f
Files: 146
Total size: 642.9 KB
Directory structure:
gitextract_hav1tonz/
├── .claude/
│ └── settings.json
├── .dockerignore
├── .editorconfig
├── .githooks/
│ └── pre-commit
├── .github/
│ ├── CODEOWNERS
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug-report.yml
│ │ ├── chore.yml
│ │ ├── config.yml
│ │ └── feature-request.yml
│ ├── dependabot.yml
│ ├── pull_request_template.md
│ └── workflows/
│ ├── codeql-analysis.yml
│ ├── dependency-review.yml
│ ├── e2e.yml
│ ├── release.yml
│ ├── release_dep.yml
│ ├── release_dep_aarch64.yml
│ ├── release_grpc.yml
│ ├── semgrep.yml
│ └── tests.yml
├── .gitignore
├── .golangci.yml
├── .rr.yaml
├── .vscode/
│ └── launch.json
├── CHANGELOG.md
├── CLAUDE.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Dockerfile
├── LICENSE
├── Makefile
├── README.md
├── SECURITY.md
├── benchmarks/
│ └── simple.js
├── cmd/
│ └── rr/
│ ├── command_test.go
│ ├── doc.go
│ └── main.go
├── codecov.yml
├── composer.json
├── container/
│ ├── config.go
│ ├── config_test.go
│ ├── container_test.go
│ ├── doc.go
│ ├── plugins.go
│ ├── plugins_test.go
│ └── test/
│ ├── endure_ok.yaml
│ ├── endure_ok_debug.yaml
│ ├── endure_ok_error.yaml
│ ├── endure_ok_foobar.yaml
│ ├── endure_ok_info.yaml
│ ├── endure_ok_warn.yaml
│ └── without_endure_ok.yaml
├── download-latest.sh
├── githooks-installer.sh
├── go.mod
├── go.sum
├── go.work
├── go.work.sum
├── internal/
│ ├── cli/
│ │ ├── doc.go
│ │ ├── jobs/
│ │ │ ├── command.go
│ │ │ ├── command_test.go
│ │ │ ├── doc.go
│ │ │ ├── render.go
│ │ │ └── subcommands.go
│ │ ├── reset/
│ │ │ ├── command.go
│ │ │ ├── command_test.go
│ │ │ └── doc.go
│ │ ├── root.go
│ │ ├── root_test.go
│ │ ├── serve/
│ │ │ ├── command.go
│ │ │ ├── command_test.go
│ │ │ ├── command_windows.go
│ │ │ └── doc.go
│ │ ├── stop/
│ │ │ ├── command.go
│ │ │ ├── command_test.go
│ │ │ └── doc.go
│ │ └── workers/
│ │ ├── command.go
│ │ ├── command_test.go
│ │ ├── doc.go
│ │ └── render.go
│ ├── debug/
│ │ ├── doc.go
│ │ ├── server.go
│ │ └── server_test.go
│ ├── meta/
│ │ ├── doc.go
│ │ ├── meta.go
│ │ └── meta_test.go
│ ├── rpc/
│ │ ├── client.go
│ │ ├── client_test.go
│ │ ├── doc.go
│ │ ├── includes.go
│ │ └── test/
│ │ ├── config_rpc_conn_err.yaml
│ │ ├── config_rpc_empty.yaml
│ │ ├── config_rpc_ok.yaml
│ │ ├── config_rpc_ok_env.yaml
│ │ ├── config_rpc_wrong.yaml
│ │ └── include1/
│ │ ├── .rr-include.yaml
│ │ └── .rr.yaml
│ └── sdnotify/
│ ├── doc.go
│ └── sdnotify.go
├── lib/
│ ├── doc.go
│ ├── roadrunner.go
│ └── roadrunner_test.go
├── schemas/
│ ├── config/
│ │ ├── 1.0.schema.json
│ │ ├── 2.0.schema.json
│ │ └── 3.0.schema.json
│ ├── package.json
│ ├── readme.md
│ └── test.js
└── tests/
├── configs/
│ ├── .rr-grpc-otel.yaml
│ ├── .rr-grpc.yaml
│ ├── .rr-http-middleware.yaml
│ ├── .rr-http-otel.yaml
│ ├── .rr-http-static.yaml
│ ├── .rr-jobs-memory-otel.yaml
│ └── .rr-jobs-memory.yaml
├── doc.go
├── e2e_grpc_test.go
├── e2e_http_test.go
├── e2e_jobs_test.go
├── go.mod
├── go.sum
├── helpers/
│ ├── doc.go
│ └── helpers.go
├── mock/
│ ├── doc.go
│ ├── logger.go
│ └── observer.go
├── php_test_files/
│ ├── .gitignore
│ ├── composer.json
│ ├── grpc/
│ │ ├── src/
│ │ │ ├── EchoService.php
│ │ │ ├── GPBMetadata/
│ │ │ │ └── Service.php
│ │ │ ├── Health/
│ │ │ │ ├── HealthCheckRequest.php
│ │ │ │ ├── HealthCheckResponse/
│ │ │ │ │ └── ServingStatus.php
│ │ │ │ ├── HealthCheckResponse.php
│ │ │ │ └── HealthInterface.php
│ │ │ ├── HealthService.php
│ │ │ └── Service/
│ │ │ ├── EchoInterface.php
│ │ │ └── Message.php
│ │ └── worker-grpc.php
│ ├── http/
│ │ ├── client.php
│ │ └── echo.php
│ └── jobs/
│ └── jobs_ok.php
├── proto/
│ └── service/
│ ├── service.pb.go
│ ├── service.proto
│ └── service_grpc.pb.go
└── testdata/
└── sample.txt
================================================
FILE CONTENTS
================================================
================================================
FILE: .claude/settings.json
================================================
{
"hooks": {
"Stop": [
{
"hooks": [
{
"type": "command",
"command": "golangci-lint run --timeout 120s 2>&1 || true",
"timeout": 180,
"statusMessage": "Running golangci-lint..."
}
]
}
]
}
}
================================================
FILE: .dockerignore
================================================
.dockerignore
.git
.gitignore
.editorconfig
.github
/src
/tests
/bin
composer.json
vendor_php
Makefile
CHANGELOG.md
LICENSE
.golangci*
.rr-sample-*.yaml
go.work
go.work.sum
================================================
FILE: .editorconfig
================================================
root = true
[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
indent_style = tab
indent_size = 4
trim_trailing_whitespace = true
[*.{yml,yaml,sh,conf}]
indent_size = 2
[{Makefile,go.mod,*.go}]
indent_style = tab
================================================
FILE: .githooks/pre-commit
================================================
#!/bin/bash
set -e -o pipefail
# https://github.com/koalaman/shellcheck/wiki/SC2039#redirect-both-stdout-and-stderr
if ! command -v golangci-lint 2>&1 /dev/null; then
echo "golangci-lint is not installed"
exit 1
fi
exec golangci-lint --build-tags=race run "$@"
================================================
FILE: .github/CODEOWNERS
================================================
# Primary owners
@wolfy-j @rustatian
================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms
github: roadrunner-server
================================================
FILE: .github/ISSUE_TEMPLATE/bug-report.yml
================================================
name: Bug Report
description: 🐛 File a bug report
title: "[🐛 BUG]: "
labels: ["B-bug", "F-need-verification"]
assignees:
- rustatian
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to fill out this bug report!
- type: checkboxes
id: search-done
attributes:
label: No duplicates 🥲.
options:
- label: I have searched for a similar issue in our bug tracker and didn't find any solutions.
required: true
- type: textarea
id: what-happened
attributes:
label: What happened?
description: Also tell us, what did you expect to happen?
placeholder: Tell us what you see!
value: "A bug happened!"
validations:
required: true
- type: textarea
id: version
attributes:
label: Version (rr --version)
description: What version of our software are you running?
placeholder: 2.6.0
validations:
required: true
- type: textarea
id: repro
attributes:
label: How to reproduce the issue?
description: .rr.yaml and steps on how to reproduce the issue?
validations:
required: true
- type: textarea
id: logs
attributes:
label: Relevant log output
description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks.
render: shell
================================================
FILE: .github/ISSUE_TEMPLATE/chore.yml
================================================
name: Chore
description: 🧹 Enhancement or chore of the existing code
title: "[🧹 CHORE]: "
labels: ["C-enhancement"]
assignees:
- rustatian
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to fill out this report!
- type: checkboxes
id: search-done
attributes:
label: No duplicates 🥲.
options:
- label: I have searched for a similar issue.
required: true
- type: textarea
id: what-happened
attributes:
label: What should be improved or cleaned up?
description: Also tell us, what did you expect to happen?
placeholder: Tell us what you see!
validations:
required: true
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
- name: ❓ Start a discussion or ask a question.
url: https://github.com/roadrunner-server/roadrunner/discussions
about: Please ask and answer questions here.
================================================
FILE: .github/ISSUE_TEMPLATE/feature-request.yml
================================================
name: Feature request
description: 💡 Suggest an idea for this project
title: "[💡 FEATURE REQUEST]: "
labels: ["C-feature-request"]
assignees:
- rustatian
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to share your idea!
- type: dropdown
id: plugin
attributes:
label: Plugin
description: What plugin is affected?
options:
- GRPC
- HTTP
- HTTP Middleware (any)
- Jobs
- Jobs driver
- TCP
- File server
- Config
- KV
- KV driver
- Logger
- Metrics
- Temporal
- Service
- Server
- Status
- Centrifuge
- type: textarea
id: idea
attributes:
label: I have an idea!
description: Clear and concise description of your idea.
placeholder: Tell us what you see!
value: "I have an idea, listen to me!!"
validations:
required: true
================================================
FILE: .github/dependabot.yml
================================================
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
version: 2
updates:
- package-ecosystem: gomod # See documentation for possible values
directory: "/" # Location of package manifests
schedule:
interval: daily
reviewers:
- "rustatian"
assignees:
- "rustatian"
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: daily
reviewers:
- "rustatian"
assignees:
- "rustatian"
- package-ecosystem: "docker"
directory: "/"
schedule:
interval: daily
reviewers:
- "rustatian"
assignees:
- "rustatian"
================================================
FILE: .github/pull_request_template.md
================================================
# Reason for This PR
`[Author TODO: add issue # or explain reasoning.]`
## Description of Changes
`[Author TODO: add description of changes.]`
## License Acceptance
By submitting this pull request, I confirm that my contribution is made under the terms of the MIT license.
## PR Checklist
`[Author TODO: Meet these criteria.]`
`[Reviewer TODO: Verify that these criteria are met. Request changes if not]`
- [ ] All commits in this PR are signed (`git commit -s`).
- [ ] The reason for this PR is clearly provided (issue no. or explanation).
- [ ] The description of changes is clear and encompassing.
- [ ] Any required documentation changes (code and docs) are included in this PR.
- [ ] Any user-facing changes are mentioned in `CHANGELOG.md`.
- [ ] All added/changed functionality is tested.
================================================
FILE: .github/workflows/codeql-analysis.yml
================================================
# For most projects, this workflow file will not need changing; you simply need to commit it to your repository.
#
# You may wish to alter this file to override the set of languages analyzed, or to provide custom queries or build logic.
name: "CodeQL"
on:
push:
branches: [master, stable]
pull_request:
branches: [master, stable]
schedule:
- cron: '0 15 * * 6'
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
language: ['go'] # Supported options are ['csharp', 'cpp', 'go', 'java', 'javascript', 'python']
steps:
- name: Checkout repository
uses: actions/checkout@v6
with:
# We must fetch at least the immediate parents so that if this is a pull request then we can checkout the head
fetch-depth: 2
# Initializes the Golang environment for the CodeQL tools.
# https://github.com/github/codeql-action/issues/1842#issuecomment-1704398087
- name: Install Go
uses: actions/setup-go@v6
with:
go-version-file: go.mod
- name: Initialize CodeQL
uses: github/codeql-action/init@v4
with:
languages: ${{ matrix.language }}
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v4
================================================
FILE: .github/workflows/dependency-review.yml
================================================
# Dependency Review Action
#
# This Action will scan dependency manifest files that change as part of a Pull Request, surfacing known-vulnerable versions of the packages declared or updated in the PR. Once installed, if the workflow run is marked as required, PRs introducing known-vulnerable packages will be blocked from merging.
#
# Source repository: https://github.com/actions/dependency-review-action
# Public documentation: https://docs.github.com/en/code-security/supply-chain-security/understanding-your-software-supply-chain/about-dependency-review#dependency-review-enforcement
name: 'Dependency Review'
on: [pull_request]
permissions:
contents: read
jobs:
dependency-review:
runs-on: ubuntu-latest
steps:
- name: 'Checkout Repository'
uses: actions/checkout@v6
- name: 'Dependency Review'
uses: actions/dependency-review-action@v4
================================================
FILE: .github/workflows/e2e.yml
================================================
name: e2e_tests
on:
push:
branches:
- master
- stable
pull_request:
branches:
- master
- stable
jobs:
e2e_test:
name: E2E tests (Go ${{ matrix.go }}, PHP ${{ matrix.php }}, OS ${{ matrix.os }})
runs-on: ${{ matrix.os }}
timeout-minutes: 30
strategy:
matrix:
php: ["8.5"]
go: [stable]
os: ["ubuntu-latest"]
steps:
- name: Set up Go ${{ matrix.go }}
uses: actions/setup-go@v6
with:
go-version: ${{ matrix.go }}
- name: Set up PHP ${{ matrix.php }}
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php }}
extensions: sockets
- name: Check out code
uses: actions/checkout@v6
- name: Get Composer Cache Directory
id: composer-cache
run: |
cd tests/php_test_files
echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
- name: Init Composer Cache
uses: actions/cache@v5
with:
path: ${{ steps.composer-cache.outputs.dir }}
key: ${{ runner.os }}-composer-${{ matrix.php }}-${{ hashFiles('**/composer.json') }}
restore-keys: ${{ runner.os }}-composer-
- name: Install Composer dependencies
run: cd tests/php_test_files && composer update --prefer-dist --no-progress --ansi
- name: Init Go modules Cache
uses: actions/cache@v5
with:
path: ~/go/pkg/mod
key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
restore-keys: ${{ runner.os }}-go-
- name: Install Go dependencies
run: cd tests && go mod download
- name: Run e2e tests
run: |
cd tests
go test -timeout 15m -v -race -failfast ./...
================================================
FILE: .github/workflows/release.yml
================================================
name: release
on:
release: # Docs: <https://help.github.com/en/articles/events-that-trigger-workflows#release-event-release>
types:
- released
- prereleased
jobs:
build:
name: Build for ${{ matrix.os }} (${{ matrix.arch }}, ${{ matrix.compiler }})
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
os: [windows, darwin] # linux, darwin, windows
compiler: [gcc] # gcc, musl-gcc
archiver: [zip] # tar, zip
arch: [amd64] # amd64, 386
include:
- os: linux
compiler: gcc
archiver: tar
arch: amd64
# -----
- os: linux
compiler: gcc
archiver: tar
arch: arm64
# -----
- os: darwin
compiler: gcc
archiver: tar
arch: arm64
# -----
- os: freebsd
compiler: gcc
archiver: tar
arch: amd64
# -----
- os: ''
compiler: musl-gcc # more info: <https://musl.libc.org/>
archiver: tar
arch: amd64
steps:
- name: Set up Go
uses: actions/setup-go@v6
with:
go-version: stable
- name: Check out code
uses: actions/checkout@v6
- name: Install musl
if: matrix.compiler == 'musl-gcc'
run: sudo apt-get install -y musl-tools
- name: Download dependencies
run: go mod download # `-x` means "verbose" mode
- name: Generate builder values
id: values
run: |
echo "version=$(echo ${GITHUB_REF##*/} | sed -e 's/^[vV ]*//')" >> $GITHUB_OUTPUT
echo "timestamp=$(echo $(date +%FT%T%z))" >> $GITHUB_OUTPUT
echo "binary-name=$(echo $(echo rr`[ ${{ matrix.os }} = 'windows' ] && echo '.exe'`))" >> $GITHUB_OUTPUT
if [ ${{ matrix.os }} == "windows" ]; then
echo "sign-cert-name=rr.exe.asc" >> $GITHUB_OUTPUT
else
echo "sign-cert-name=rr.asc" >> $GITHUB_OUTPUT
fi
- name: Import GPG key
uses: crazy-max/ghaction-import-gpg@v7
with:
gpg_private_key: ${{ secrets.GPG_SIGNING_KEY }}
passphrase: ${{ secrets.GPG_PASS }}
git_user_signingkey: true
git_commit_gpgsign: false
- name: Compile binary file
env:
GOOS: ${{ matrix.os }}
GOARCH: ${{ matrix.arch }}
CC: ${{ matrix.compiler }}
GPG_SIGNING_KEY: ${{ secrets.GPG_SIGNING_KEY }}
GPG_PASS: ${{secrets.GPG_PASS}}
CGO_ENABLED: 0
LDFLAGS: >-
-s -X github.com/roadrunner-server/roadrunner/v2025/internal/meta.version=${{ steps.values.outputs.version }} -X github.com/roadrunner-server/roadrunner/v2025/internal/meta.buildTime=${{ steps.values.outputs.timestamp }}
run: |
go build -trimpath -ldflags "$LDFLAGS" -o "./${{ steps.values.outputs.binary-name }}" ./cmd/rr
stat "./${{ steps.values.outputs.binary-name }}"
gpg --detach-sign --armor "./${{ steps.values.outputs.binary-name }}"
- name: Generate distributive directory name
id: dist-dir
run: >
echo "name=$(echo roadrunner-${{ steps.values.outputs.version }}-$(
[ ${{ matrix.os }} != '' ] && echo '${{ matrix.os }}' || echo 'unknown'
)$(
[ ${{ matrix.compiler }} = 'musl-gcc' ] && echo '-musl'
))-${{ matrix.arch }}" >> $GITHUB_OUTPUT
- name: Generate distributive archive name
id: dist-arch
run: >
echo "name=$(echo ${{ steps.dist-dir.outputs.name }}.$(
case ${{ matrix.archiver }} in
zip) echo 'zip';;
tar) echo 'tar.gz';;
*) exit 10;
esac
))" >> $GITHUB_OUTPUT
- name: Create distributive
run: |
mkdir ${{ steps.dist-dir.outputs.name }}
mv "./${{ steps.values.outputs.binary-name }}" "./${{ steps.values.outputs.sign-cert-name }}" ./${{ steps.dist-dir.outputs.name }}/
cp ./README.md ./CHANGELOG.md ./LICENSE ./${{ steps.dist-dir.outputs.name }}
- name: Pack distributive using tar
if: matrix.archiver == 'tar'
run: tar -zcf "${{ steps.dist-arch.outputs.name }}" "${{ steps.dist-dir.outputs.name }}"
- name: Pack distributive using zip
if: matrix.archiver == 'zip'
run: zip -r -q "${{ steps.dist-arch.outputs.name }}" "${{ steps.dist-dir.outputs.name }}"
- name: Upload artifact
uses: actions/upload-artifact@v7
with:
name: ${{ steps.dist-dir.outputs.name }}
path: ${{ steps.dist-arch.outputs.name }}
if-no-files-found: error
retention-days: 30
- name: Upload binaries to release
uses: svenstaro/upload-release-action@v2
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
file: ${{ steps.dist-arch.outputs.name }}
asset_name: ${{ steps.dist-arch.outputs.name }}
tag: ${{ github.ref }}
docker:
name: Build docker image
runs-on: ubuntu-latest
steps:
- name: Check out code
uses: actions/checkout@v6
- name: Set up QEMU
uses: docker/setup-qemu-action@v4 # Action page: <https://github.com/docker/setup-qemu-action>
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v4 # Action page: <https://github.com/docker/setup-buildx-action>
- name: Login to Docker Hub
uses: docker/login-action@v4
with:
username: ${{ secrets.DOCKER_LOGIN }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Login to GitHub Container Registry
uses: docker/login-action@v4
with:
registry: ghcr.io
username: ${{ secrets.GHCR_LOGIN }}
password: ${{ secrets.GHCR_PASSWORD }}
- name: Generate builder values
id: values
run: |
echo "version_full=$(echo ${GITHUB_REF##*/} | sed -e 's/^[vV ]*//')" >> $GITHUB_OUTPUT
echo "timestamp=$(echo $(date +%FT%T%z))" >> $GITHUB_OUTPUT
- name: Build image
uses: docker/build-push-action@v7 # Action page: <https://github.com/docker/build-push-action>
with:
context: .
file: Dockerfile
push: true
platforms: linux/amd64,linux/arm64
build-args: |
APP_VERSION=${{ steps.values.outputs.version_full}}
BUILD_TIME=${{ steps.values.outputs.timestamp }}
tags: |
spiralscout/roadrunner:${{ steps.values.outputs.version_full}}
spiralscout/roadrunner:latest
spiralscout/roadrunner:2025
spiralscout/roadrunner:2025.1
ghcr.io/roadrunner-server/roadrunner:${{ steps.values.outputs.version_full}}
ghcr.io/roadrunner-server/roadrunner:latest
ghcr.io/roadrunner-server/roadrunner:2025
ghcr.io/roadrunner-server/roadrunner:2025.1
================================================
FILE: .github/workflows/release_dep.yml
================================================
name: release_dep
on:
release: # Docs: <https://help.github.com/en/articles/events-that-trigger-workflows#release-event-release>
types:
- released
- prereleased
jobs:
build:
name: Build for ${{ matrix.os }} (${{ matrix.arch }}, ${{ matrix.compiler }})
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
os: [linux]
compiler: [gcc]
arch: [amd64]
steps:
- name: Check out code
uses: actions/checkout@v6
- name: Set up Go
uses: actions/setup-go@v6
with:
go-version: stable
- name: Download dependencies
run: go mod download
- name: Generate builder values
id: values
run: |
echo "version=$(echo ${GITHUB_REF##*/} | sed -e 's/^[vV ]*//')" >> $GITHUB_OUTPUT
echo "timestamp=$(echo $(date +%FT%T%z))" >> $GITHUB_OUTPUT
echo "binary-name=rr" >> $GITHUB_OUTPUT
echo "sign-cert-name=rr.asc" >> $GITHUB_OUTPUT
- name: Import GPG key
uses: crazy-max/ghaction-import-gpg@v7
with:
gpg_private_key: ${{ secrets.GPG_SIGNING_KEY }}
passphrase: ${{ secrets.GPG_PASS }}
git_user_signingkey: true
git_commit_gpgsign: false
- name: Compile binary file
env:
GOOS: ${{ matrix.os }}
GOARCH: ${{ matrix.arch }}
CC: ${{ matrix.compiler }}
GPG_SIGNING_KEY: ${{ secrets.GPG_SIGNING_KEY }}
GPG_PASS: ${{secrets.GPG_PASS}}
CGO_ENABLED: 0
LDFLAGS: >-
-s -X github.com/roadrunner-server/roadrunner/v2025/internal/meta.version=${{ steps.values.outputs.version }} -X github.com/roadrunner-server/roadrunner/v2025/internal/meta.buildTime=${{ steps.values.outputs.timestamp }}
run: |
go build -trimpath -ldflags "$LDFLAGS" -o "./${{ steps.values.outputs.binary-name }}" ./cmd/rr
stat "./${{ steps.values.outputs.binary-name }}"
gpg --detach-sign --armor "./${{ steps.values.outputs.binary-name }}"
- name: Create DEB dirs
run: |
mkdir -p dist/ubuntu/roadrunner-${{ steps.values.outputs.version }}-linux-amd64/DEBIAN
mkdir -p dist/ubuntu/roadrunner-${{ steps.values.outputs.version }}-linux-amd64/usr/bin
ls -la dist/ubuntu/roadrunner-${{ steps.values.outputs.version }}-linux-amd64
- name: Create DEB control file
run: touch dist/ubuntu/roadrunner-${{ steps.values.outputs.version }}-linux-amd64/DEBIAN/control
- name: Build Debian package
run: |
echo "Package: roadrunner-${{ steps.values.outputs.version }}-linux-amd64.deb" >> dist/ubuntu/roadrunner-${{ steps.values.outputs.version }}-linux-amd64/DEBIAN/control
echo "Version: ${{ steps.values.outputs.version }}" >> dist/ubuntu/roadrunner-${{ steps.values.outputs.version }}-linux-amd64/DEBIAN/control
echo "Section: custom" >> dist/ubuntu/roadrunner-${{ steps.values.outputs.version }}-linux-amd64/DEBIAN/control
echo "Priority: optional" >> dist/ubuntu/roadrunner-${{ steps.values.outputs.version }}-linux-amd64/DEBIAN/control
echo "Architecture: amd64" >> dist/ubuntu/roadrunner-${{ steps.values.outputs.version }}-linux-amd64/DEBIAN/control
echo "Maintainer: roadrunner.dev" >> dist/ubuntu/roadrunner-${{ steps.values.outputs.version }}-linux-amd64/DEBIAN/control
echo "Description: High-performance PHP application server, load-balancer, process manager written in Go and powered with plugins." >> dist/ubuntu/roadrunner-${{ steps.values.outputs.version }}-linux-amd64/DEBIAN/control
cat dist/ubuntu/roadrunner-${{ steps.values.outputs.version }}-linux-amd64/DEBIAN/control
cp "./${{ steps.values.outputs.binary-name }}" dist/ubuntu/roadrunner-${{ steps.values.outputs.version }}-linux-amd64/usr/bin/
dpkg --build dist/ubuntu/roadrunner-${{ steps.values.outputs.version }}-linux-amd64
- name: Upload dep to release
uses: svenstaro/upload-release-action@v2
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
file: dist/ubuntu/roadrunner-${{ steps.values.outputs.version }}-linux-amd64.deb
asset_name: roadrunner-${{ steps.values.outputs.version }}-linux-amd64.deb
tag: ${{ github.ref }}
================================================
FILE: .github/workflows/release_dep_aarch64.yml
================================================
name: release_dep_arm64
on:
release: # Docs: <https://help.github.com/en/articles/events-that-trigger-workflows#release-event-release>
types:
- released
- prereleased
jobs:
build:
name: Build for ${{ matrix.os }} (${{ matrix.arch }}, ${{ matrix.compiler }})
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
os: [linux]
compiler: [gcc]
arch: [arm64]
steps:
- name: Check out code
uses: actions/checkout@v6
- name: Set up Go
uses: actions/setup-go@v6
with:
go-version: stable
- name: Download dependencies
run: go mod download
- name: Generate builder values
id: values
run: |
echo "version=$(echo ${GITHUB_REF##*/} | sed -e 's/^[vV ]*//')" >> $GITHUB_OUTPUT
echo "timestamp=$(echo $(date +%FT%T%z))" >> $GITHUB_OUTPUT
echo "binary-name=rr" >> $GITHUB_OUTPUT
echo "sign-cert-name=rr.asc" >> $GITHUB_OUTPUT
- name: Import GPG key
uses: crazy-max/ghaction-import-gpg@v7
with:
gpg_private_key: ${{ secrets.GPG_SIGNING_KEY }}
passphrase: ${{ secrets.GPG_PASS }}
git_user_signingkey: true
git_commit_gpgsign: false
- name: Compile binary file
env:
GOOS: ${{ matrix.os }}
GOARCH: ${{ matrix.arch }}
CC: ${{ matrix.compiler }}
GPG_SIGNING_KEY: ${{ secrets.GPG_SIGNING_KEY }}
GPG_PASS: ${{secrets.GPG_PASS}}
CGO_ENABLED: 0
LDFLAGS: >-
-s -X github.com/roadrunner-server/roadrunner/v2025/internal/meta.version=${{ steps.values.outputs.version }} -X github.com/roadrunner-server/roadrunner/v2025/internal/meta.buildTime=${{ steps.values.outputs.timestamp }}
run: |
go build -trimpath -ldflags "$LDFLAGS" -o "./${{ steps.values.outputs.binary-name }}" ./cmd/rr
stat "./${{ steps.values.outputs.binary-name }}"
gpg --detach-sign --armor "./${{ steps.values.outputs.binary-name }}"
- name: Create DEB dirs
run: |
mkdir -p dist/ubuntu/roadrunner-${{ steps.values.outputs.version }}-linux-arm64/DEBIAN
mkdir -p dist/ubuntu/roadrunner-${{ steps.values.outputs.version }}-linux-arm64/usr/bin
ls -la dist/ubuntu/roadrunner-${{ steps.values.outputs.version }}-linux-arm64
- name: Create DEB control file
run: touch dist/ubuntu/roadrunner-${{ steps.values.outputs.version }}-linux-arm64/DEBIAN/control
- name: Build Debian package
run: |
echo "Package: roadrunner-${{ steps.values.outputs.version }}-linux-arm64.deb" >> dist/ubuntu/roadrunner-${{ steps.values.outputs.version }}-linux-arm64/DEBIAN/control
echo "Version: ${{ steps.values.outputs.version }}" >> dist/ubuntu/roadrunner-${{ steps.values.outputs.version }}-linux-arm64/DEBIAN/control
echo "Section: custom" >> dist/ubuntu/roadrunner-${{ steps.values.outputs.version }}-linux-arm64/DEBIAN/control
echo "Priority: optional" >> dist/ubuntu/roadrunner-${{ steps.values.outputs.version }}-linux-arm64/DEBIAN/control
echo "Architecture: arm64" >> dist/ubuntu/roadrunner-${{ steps.values.outputs.version }}-linux-arm64/DEBIAN/control
echo "Maintainer: roadrunner.dev" >> dist/ubuntu/roadrunner-${{ steps.values.outputs.version }}-linux-arm64/DEBIAN/control
echo "Description: High-performance PHP application server, load-balancer, process manager written in Go and powered with plugins." >> dist/ubuntu/roadrunner-${{ steps.values.outputs.version }}-linux-arm64/DEBIAN/control
cat dist/ubuntu/roadrunner-${{ steps.values.outputs.version }}-linux-arm64/DEBIAN/control
cp "./${{ steps.values.outputs.binary-name }}" dist/ubuntu/roadrunner-${{ steps.values.outputs.version }}-linux-arm64/usr/bin/
dpkg --build dist/ubuntu/roadrunner-${{ steps.values.outputs.version }}-linux-arm64
- name: Upload dep to release
uses: svenstaro/upload-release-action@v2
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
file: dist/ubuntu/roadrunner-${{ steps.values.outputs.version }}-linux-arm64.deb
asset_name: roadrunner-${{ steps.values.outputs.version }}-linux-arm64.deb
tag: ${{ github.ref }}
================================================
FILE: .github/workflows/release_grpc.yml
================================================
name: release_grpc
on:
release: # Docs: <https://help.github.com/en/articles/events-that-trigger-workflows#release-event-release>
types:
- prereleased
- released
jobs:
build:
name: Build for ${{ matrix.os }} (${{ matrix.arch }}, ${{ matrix.compiler }})
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
os: [windows, darwin] # linux, darwin, windows
compiler: [gcc] # gcc, musl-gcc
archiver: [zip] # tar, zip
arch: [amd64] # amd64, 386
include:
- os: linux
compiler: gcc
archiver: tar
arch: amd64
#----------
- os: linux
compiler: gcc
archiver: tar
arch: arm64
#----------
- os: freebsd
compiler: gcc
archiver: tar
arch: amd64
#----------
- os: darwin
compiler: gcc
archiver: tar
arch: arm64
#----------
- os: ''
compiler: musl-gcc # more info: <https://musl.libc.org/>
archiver: tar
arch: amd64
steps:
- name: Set up Go
uses: actions/setup-go@v6
with:
go-version: stable
- name: Check out code
uses: actions/checkout@v6
with:
repository: 'roadrunner-server/grpc'
- name: Install musl
if: matrix.compiler == 'musl-gcc'
run: sudo apt-get install -y musl-tools
- name: Download dependencies
run: cd protoc_plugins && go mod download
- name: Generate builder values
id: values
run: |
echo "version=$(echo ${GITHUB_REF##*/} | sed -e 's/^[vV ]*//')" >> $GITHUB_OUTPUT
echo "timestamp=$(echo $(date +%FT%T%z))" >> $GITHUB_OUTPUT
echo "binary-name=$(echo $(echo protoc-gen-php-grpc`[ ${{ matrix.os }} = 'windows' ] && echo '.exe'`))" >> $GITHUB_OUTPUT
if [ ${{ matrix.os }} == "windows" ]; then
echo "sign-cert-name=protoc-gen-php-grpc.exe.asc" >> $GITHUB_OUTPUT
else
echo "sign-cert-name=protoc-gen-php-grpc.asc" >> $GITHUB_OUTPUT
fi
- name: Import GPG key
uses: crazy-max/ghaction-import-gpg@v7
with:
gpg_private_key: ${{ secrets.GPG_SIGNING_KEY }}
passphrase: ${{ secrets.GPG_PASS }}
git_user_signingkey: true
git_commit_gpgsign: false
- name: Compile binary file
env:
GOOS: ${{ matrix.os }}
GOARCH: ${{ matrix.arch }}
CC: ${{ matrix.compiler }}
CGO_ENABLED: 0
LDFLAGS: >-
-s
run: |
cd protoc_plugins && go build -trimpath -ldflags "$LDFLAGS" -o "../${{ steps.values.outputs.binary-name }}" protoc-gen-php-grpc/main.go
stat "../${{ steps.values.outputs.binary-name }}"
gpg --detach-sign --armor "../${{ steps.values.outputs.binary-name }}"
- name: Generate distributive directory name
id: dist-dir
run: >
echo "name=$(echo protoc-gen-php-grpc-${{ steps.values.outputs.version }}-$(
[ ${{ matrix.os }} != '' ] && echo '${{ matrix.os }}' || echo 'unknown'
)$(
[ ${{ matrix.compiler }} = 'musl-gcc' ] && echo '-musl'
))-${{ matrix.arch }}" >> $GITHUB_OUTPUT
- name: Generate distributive archive name
id: dist-arch
run: >
echo "name=$(echo ${{ steps.dist-dir.outputs.name }}.$(
case ${{ matrix.archiver }} in
zip) echo 'zip';;
tar) echo 'tar.gz';;
*) exit 10;
esac
))" >> $GITHUB_OUTPUT
- name: Create distributive
run: |
mkdir ${{ steps.dist-dir.outputs.name }}
mv "./${{ steps.values.outputs.binary-name }}" "./${{ steps.values.outputs.sign-cert-name }}" ./${{ steps.dist-dir.outputs.name }}/
- name: Pack distributive using tar
if: matrix.archiver == 'tar'
run: tar -zcf "${{ steps.dist-arch.outputs.name }}" "${{ steps.dist-dir.outputs.name }}"
- name: Pack distributive using zip
if: matrix.archiver == 'zip'
run: zip -r -q "${{ steps.dist-arch.outputs.name }}" "${{ steps.dist-dir.outputs.name }}"
- name: Upload artifact
uses: actions/upload-artifact@v7
with:
name: ${{ steps.dist-dir.outputs.name }}
path: ${{ steps.dist-arch.outputs.name }}
if-no-files-found: error
retention-days: 30
- name: Upload binaries to release
uses: svenstaro/upload-release-action@v2
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
file: ${{ steps.dist-arch.outputs.name }}
asset_name: ${{ steps.dist-arch.outputs.name }}
tag: ${{ github.ref }}
================================================
FILE: .github/workflows/semgrep.yml
================================================
name: semgrep
on:
pull_request: {}
push:
branches:
- master
- stable
paths:
- .github/workflows/semgrep.yml
jobs:
semgrep:
name: semgrep/ci
runs-on: ubuntu-latest
env:
SEMGREP_APP_TOKEN: ${{ secrets.SEMGREP_APP_TOKEN }}
container:
image: returntocorp/semgrep
steps:
- uses: actions/checkout@v6
- run: semgrep ci
================================================
FILE: .github/workflows/tests.yml
================================================
name: rr_cli_tests
on:
push:
branches:
- master
- stable
pull_request:
jobs:
golangci-lint:
name: Golang-CI (lint)
runs-on: ubuntu-latest
steps:
- name: Check out code
uses: actions/checkout@v6
- name: Set up Go
uses: actions/setup-go@v6 # action page: <https://github.com/actions/setup-go>
with:
go-version: stable
- name: Run linter
uses: golangci/golangci-lint-action@v9
with:
only-new-issues: false # show only new issues if it's a pull request
args: -v --build-tags=race --timeout=10m
go-test:
name: Unit tests
runs-on: ubuntu-latest
steps:
- name: Set up Go
uses: actions/setup-go@v6
with:
go-version: stable
- name: Check out code
uses: actions/checkout@v6
with:
fetch-depth: 2 # Fixes codecov error 'Issue detecting commit SHA'
- name: Init Go modules Cache # Docs: <https://git.io/JfAKn#go---modules>
uses: actions/cache@v5
with:
path: ~/go/pkg/mod
key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
restore-keys: ${{ runner.os }}-go-
- name: Install Go dependencies
run: go mod download
- name: Run Unit tests
run: go test -race -covermode=atomic -coverprofile /tmp/coverage.txt ./...
- name: Upload Coverage report to CodeCov
continue-on-error: true
uses: codecov/codecov-action@v5.5.2 # https://github.com/codecov/codecov-action
with:
files: /tmp/coverage.txt
build:
name: Build for ${{ matrix.os }}
runs-on: ubuntu-latest
needs: [go-test]
strategy:
fail-fast: false
matrix:
os: [linux, darwin, windows, freebsd]
steps:
- name: Set up Go
uses: actions/setup-go@v6 # action page: <https://github.com/actions/setup-go>
with:
go-version: stable
- name: Check out code
uses: actions/checkout@v6
- name: Init Go modules Cache # Docs: <https://git.io/JfAKn#go---modules>
uses: actions/cache@v5
with:
path: ~/go/pkg/mod
key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
restore-keys: ${{ runner.os }}-go-
- name: Install Go dependencies
run: go mod download && go mod verify
- name: Generate version value
id: values # for PR this value will be `merge@__hash__`, SO: <https://stackoverflow.com/a/59780579/2252921>
run: |
echo "version=$(echo ${GITHUB_REF##*/} | sed -e 's/^[vV ]*//')" >> $GITHUB_OUTPUT
echo "timestamp=$(echo $(date +%FT%T%z))" >> $GITHUB_OUTPUT
- name: Compile binary file
env:
GOOS: ${{ matrix.os }}
GOARCH: amd64
CGO_ENABLED: 0
LDFLAGS: -s -X github.com/roadrunner-server/roadrunner/v2025/internal/meta.version=${{ steps.values.outputs.version }} -X github.com/roadrunner-server/roadrunner/v2025/internal/meta.buildTime=${{ steps.values.outputs.timestamp }}
run: go build -trimpath -ldflags "$LDFLAGS" -o ./rr ./cmd/rr
- name: Try to execute
if: matrix.os == 'linux'
run: ./rr -v
- name: Upload artifact
uses: actions/upload-artifact@v7
with:
name: rr-${{ matrix.os }}
path: ./rr
if-no-files-found: error
retention-days: 10
docker-image:
name: Build docker image
runs-on: ubuntu-latest
needs: [go-test]
steps:
- name: Check out code
uses: actions/checkout@v6
- name: Build image
run: docker build -t rr:local -f ./Dockerfile .
- name: Try to execute
run: docker run --rm rr:local -v
- uses: aquasecurity/trivy-action@0.35.0 # action page: <https://github.com/aquasecurity/trivy-action>
with:
image-ref: rr:local
format: "table"
severity: HIGH,CRITICAL
exit-code: 1
================================================
FILE: .gitignore
================================================
# Created by .ignore support plugin (hsz.mobi)
### Go template
# Binaries for programs and plugins
*.exe
*.exe~
*.dll
*.so
*.dylib
# Test binary, built with `go test -c`
*.test
# Output of the go coverage tool, specifically when used with LiteIDE
*.out
# Dependency directories (remove the comment below to include it)
# vendor/
.idea
coverage
/rr
rr.exe
.rr-sample-*
.pid
.DS_Store
**/.DS_Store
**/node_modules
**/vendor/
**/composer.lock
================================================
FILE: .golangci.yml
================================================
version: "2"
run:
allow-parallel-runners: true
output:
formats:
text:
path: stdout
linters:
default: none
enable:
- asciicheck
- bodyclose
- copyloopvar
- dogsled
- dupl
- errcheck
- errorlint
- exhaustive
- gochecknoglobals
- goconst
- gocritic
- goprintffuncname
- gosec
- govet
- ineffassign
- misspell
- nakedret
- noctx
- nolintlint
- prealloc
- revive
- staticcheck
- tparallel
- unconvert
- unparam
- unused
- whitespace
settings:
dupl:
threshold: 100
goconst:
min-len: 2
min-occurrences: 3
godot:
scope: declarations
capital: true
lll:
line-length: 120
misspell:
locale: US
nolintlint:
require-specific: true
prealloc:
simple: true
range-loops: true
for-loops: true
revive:
enable-default-rules: true
rules:
- name: var-naming
disabled: true
wsl:
allow-assign-and-anything: true
exclusions:
generated: lax
presets:
- comments
- common-false-positives
- legacy
- std-error-handling
rules:
- linters:
- dupl
- funlen
- gocognit
- scopelint
path: _test\.go
paths:
- internal/debug/server_test.go
- .github
- .git
- third_party$
- builtin$
- examples$
formatters:
enable:
- gofmt
- goimports
exclusions:
generated: lax
paths:
- internal/debug/server_test.go
- .github
- .git
- third_party$
- builtin$
- examples$
================================================
FILE: .rr.yaml
================================================
######################################################################################
# THIS IS SAMPLE OF THE CONFIGURATION #
# IT'S NOT A DEFAULT CONFIGURATION, IT'S JUST A REFERENCE TO ALL OPTIONS AND PLUGINS #
# MORE DOCS CAN BE FOUND HERE: <https://roadrunner.dev/docs/intro-config> #
######################################################################################
# Production usage guide: https://roadrunner.dev/docs/app-server-production/2.x/en
# Hint: RR will replace any config options using reference to environment variables,
# eg.: `option_key: ${ENVIRONMENT_VARIABLE_NAME}`.
# Important: TCP port numbers for each plugin (rpc, http, etc) must be unique!
# RR configuration version
version: '3'
# Remote Procedures Calling (docs: https://roadrunner.dev/docs/plugins-rpc/2.x/en)
# Is used for connecting to RoadRunner server from your PHP workers.
rpc:
# TCP address:port for listening.
#
# Default: "tcp://127.0.0.1:6001"
listen: tcp://127.0.0.1:6001
# Application server settings (docs: https://roadrunner.dev/docs/php-worker)
server:
# Execute command before the main server's command.
on_init:
# Command to execute before the main server's command
#
# This option is required if using on_init
command: "any php or script here"
# Script execute timeout
#
# Default: 60s [60m, 60h], if used w/o units its means - NANOSECONDS.
exec_timeout: 20s
# Exit on init error
# Default: false
exit_on_error: false
# Environment variables for the worker processes.
#
# Default: <empty map>
env:
SOME_KEY: "SOME_VALUE"
SOME_KEY2: "SOME_VALUE2"
# Username (not UID) of the user from whom the on_init command is executed. An empty value means to use the RR process user.
#
# Default: ""
# user: ""
# Worker starting command, with any required arguments.
#
# This option is required.
command: "php psr-worker.php"
# Username (not UID) for the worker processes. An empty value means to use the RR process user.
#
# Default: ""
# user: ""
# Group name (not GID) for the worker processes. An empty value means to use the RR process group.
#
# Default: ""
# group: ""
# Environment variables for the worker processes.
#
# Default: <empty map>
env:
SOME_KEY: "SOME_VALUE"
SOME_KEY2: "SOME_VALUE2"
# Worker relay can be: "pipes", TCP (eg.: tcp://127.0.0.1:6002), or socket (eg.: unix:///var/run/rr.sock).
#
# Default: "pipes"
relay: pipes
# Logging settings (docs: https://roadrunner.dev/docs/plugins-logger/2.x/en)
logs:
# Logging mode can be "development", "production" or "raw". Do not forget to change this value for production environment.
#
# Development mode (which makes DPanicLevel logs panic), uses a console encoder, writes to standard error, and
# disables sampling. Stacktraces are automatically included on logs of WarnLevel and above.
#
# Default: "development"
mode: development
# Logging level can be "panic", "error", "warn", "info", "debug".
#
# Default: "debug"
level: debug
# Encoding format can be "console" or "json" (last is preferred for production usage).
#
# Default: "console"
encoding: console
# Log line ending
#
# Default: "\n"
line_ending: "\n"
# Output can be file (eg.: "/var/log/rr_errors.log"), "stderr" or "stdout".
#
# Default: "stderr"
output: ["stderr"]
# Errors only output can be file (eg.: "/var/log/rr_errors.log"), "stderr" or "stdout".
#
# Default: ["stderr"]
err_output: ["stderr"]
# File logger options
#
# Default: null
file_logger_options:
# Path to the file
#
# Default: It uses <processname>-lumberjack.log name in the os tempdir if empty.
log_output: "/tmp/my.log"
# Max file size in MB
#
# Default: 100
max_size: 100
# max_age is the maximum number of days to retain old log files based on the timestamp encoded in their filename.
#
# Default: 1 (day)
max_age: 1
# max_backups is the maximum number of old log files to retain.
#
# Default: retain all (if set to 0)
max_backups: 5
# Compress determines if the rotated log files should be compressed using gzip.
#
# Default: false
compress: false
# You can configure each plugin log messages individually (key is plugin name, and value is logging options in same
# format as above).
#
# Default: <empty map>
channels:
http:
mode: development
level: panic
encoding: console
output: ["stdout"]
err_output: ["stderr"]
server:
mode: production
level: info
encoding: json
output: ["stdout"]
err_output: ["stdout"]
rpc:
mode: raw
level: debug
encoding: console
output: ["stderr"]
err_output: ["stdout"]
# Workflow and activity mesh service.
#
# Drop this section for temporal feature disabling.
temporal:
# Address of temporal server.
#
# Default: "127.0.0.1:7233"
address: 127.0.0.1:7233
# Sticky cache size. Sticky workflow execution is the affinity
# between workflow tasks of a specific workflow execution to a specific worker. The benefit of sticky execution is that
# the workflow does not have to reconstruct state by replaying history from the beginning. The cache is shared between
# workers running within same process. This must be called before any worker is started. If not called, the default
# size of 10K (which may change) will be used.
#
# Default: 10_000
cache_size: 10000
# Namespace name for this client to work with
#
# Default: default
namespace: default
# Temporal metrics
#
# Optional section
metrics:
# Metrics driver to use
# Optional, default: prometheus. Available values: prometheus, statsd
driver: prometheus
# ---- Prometheus
prometheus:
# Server metrics address
# Required for the production. Default: 127.0.0.1:9091, for the metrics 127.0.0.1:9091/metrics
address: 127.0.0.1:9091
# Metrics type
type: "summary"
# Temporal metrics prefix
# Default: (empty)
prefix: "foobar"
# ---- Statsd (uncomment)
# Statsd host and port
#statsd:
# Optional
# default: 127.0.0.1:8125
# host_port: "127.0.0.1:8125"
#
# Prefix for the metrics
# Optional, default: empty
# prefix: "samples"
#
# Flush interval is the maximum interval for sending packets.
# Optional, default: 1s
# flush_interval: 1s
#
# Flush bytes specifies the maximum udp packet size you wish to send.
# If FlushBytes is unspecified, it defaults to 1432 bytes, which is
# considered safe for local traffic
# Optional, default: 1432
# flush_bytes: 1432
#
# Tags passed to the statsd on init
# Optional, default: empty
#tags:
# foo: bar
# Temporal TLS configuration
#
# This section is optional
tls:
# Path to the key file
#
# This option is required
key: "/ssl/key.pem"
# Path to the certificate
#
# This option is required
cert: "/ssl/cert.crt"
# Path to the CA certificate, defines the set of root certificate authorities that servers use if required to verify a client certificate. Used with the `client_auth_type` option.
#
# This option is optional
root_ca: "/ssl/ca.crt"
# Client auth type.
#
# This option is optional. Default value: no_client_certs. Possible values: request_client_cert, require_any_client_cert, verify_client_cert_if_given, require_and_verify_client_cert, no_client_certs
client_auth_type: no_client_certs
# ServerName is used to verify the hostname on the returned
# certificates unless InsecureSkipVerify is given. It is also included
# in the client's handshake to support virtual hosting unless it is
# an IP address.
#
# Default: hostname
server_name: "tls-sample"
# Activities pool settings.
#
# Equal to the regular pool options
activities:
# Debug mode for the pool. In this mode, pool will not pre-allocate the worker. Worker (only 1, num_workers ignored) will be allocated right after the request arrived.
#
# Default: false
debug: false
# Override server's command
#
# Default: empty
command: "php my-super-app.php"
# How many worker processes will be started. Zero (or nothing) means the number of logical CPUs.
#
# Default: 0
num_workers: 0
# Maximal count of worker executions. Zero (or nothing) means no limit.
#
# Default: 0
max_jobs: 0
# [2023.3.10]
# Maximum size of the internal requests queue. After reaching the limit, all additional requests would be rejected with error.
#
# Default: 0 (no limit)
max_queue_size: 0
# Timeout for worker allocation. Zero means 60s.
#
# Default: 60s
allocate_timeout: 60s
# Timeout for the reset timeout. Zero means 60s.
#
# Default: 60s
reset_timeout: 60s
# Timeout for worker destroying before process killing. Zero means 60s.
#
# Default: 60s
destroy_timeout: 60s
# Supervisor is used to control http workers (previous name was "limit", docs:
# https://roadrunner.dev/docs/php-limit). "Soft" limits will not interrupt current request processing. "Hard"
# limit on the contrary - interrupts the execution of the request.
supervisor:
# How often to check the state of the workers.
#
# Default: 5s
watch_tick: 5s
# Maximum time worker is allowed to live (soft limit). Zero means no limit.
#
# Default: 0s
ttl: 0s
# How long worker can spend in IDLE mode after first using (soft limit). Zero means no limit.
#
# Default: 0s
idle_ttl: 10s
# Maximal worker memory usage in megabytes (soft limit). Zero means no limit.
#
# Default: 0
max_worker_memory: 128
# Maximal job lifetime (hard limit). Zero means no limit.
#
# Default: 0s
exec_ttl: 60s
# KV plugin settings. Available drivers: boltdb, redis, memcached, memory.
#
# Any number of sections can be defined here.
kv:
# User defined name of the section
#
# Default: none
boltdb-south:
# Driver which should be used for the storage
#
# This option is required.
driver: boltdb
# Local configuration section
#
# This option is required to use local section, otherwise (boltdb-south) global configuration will be used.
config:
# File name for the DB
#
# Default: "rr.db"
file: "rr.db"
# Access permission for the DB file.
#
# Default: "0755"
permissions: 0755
# TTL keys check interval in seconds. It's safe to use 1 second here, but can be a little costly to performance.
#
# Default: "60" seconds
interval: 40
# User defined name of the section (us-cental-kv used as example)
#
# Default: none
us-central-kv:
# Driver which should be used for the storage
#
# Default: none
driver: memcached
# Local configuration section
#
# This option is required to use local section, otherwise (us-central-kv) global configuration will be used.
config:
# Driver specific section. Addresses of the memcached node(s).
#
# Default: [ "localhost:11211" ]
addr: [ "localhost:11211" ]
# User defined name of the section
#
# Default: none
fast-kv-fr:
# Driver which should be used for the storage.
#
# Default: none
driver: redis
# Redis specific section. If one address provided - single node client will be used.
#
#
# UniversalClient is an abstract client which - based on the provided options -
# can connect to either clusters, or sentinel-backed failover instances
# or simple single-instance servers. This can be useful for testing
# cluster-specific applications locally.
# if the number of addrs is 1 and master_name is empty, a single-node redis Client will be returned
# if the number of addrs is two or more, a ClusterClient will be returned
# Local configuration section
#
# This option is required to use local section, otherwise (fast-kv-fr) global configuration will be used.
config:
addrs:
- "localhost:6379"
# if a MasterName is passed a sentinel-backed FailoverClient will be returned
master_name: ""
username: ""
password: ""
db: 0
sentinel_password: ""
route_by_latency: false
route_randomly: false
dial_timeout: 0s # accepted values [1s, 5m, 3h]
max_retries: 1
min_retry_backoff: 0s # accepted values [1s, 5m, 3h]
max_retry_backoff: 0s # accepted values [1s, 5m, 3h]
pool_size: 0
min_idle_conns: 0
max_conn_age: 0s # accepted values [1s, 5m, 3h]
read_timeout: 0s # accepted values [1s, 5m, 3h]
write_timeout: 0s # accepted values [1s, 5m, 3h]
pool_timeout: 0s # accepted values [1s, 5m, 3h]
idle_timeout: 0s # accepted values [1s, 5m, 3h]
idle_check_freq: 0s # accepted values [1s, 5m, 3h]
read_only: false
# User defined name of the section
#
# Default: none
local-memory:
# In memory driver specific section
#
# Default: none
driver: memory
config: { }
# Service plugin settings
service:
# User defined service name
#
# Default: none, required
some_service_1:
# Command to execute. Can be any command here which can be executed.
#
# Default: none, required.
command: php tests/plugins/service/test_files/loop.php
# Env variables for the process
#
# Default: empty
env:
foo: "BAR"
foo2: "BAR2"
# Number of copies (processes) to start per command.
#
# Default: 1
process_num: 1
# Timeout for the process stop operation
#
# Default: 5 seconds
timeout_stop_sec: 5
# Allowed time before stop.
#
# Default: 0 (infinity), can be 1s, 2m, 2h (seconds, minutes, hours) and complex 2h2m1s.
exec_timeout: 0s
# Show the name of the service in logs (e.g. service.some_service_1)
#
# Default: false
service_name_in_log: false
# Remain process after exit. In other words, restart process after exit with any exit code.
#
# Default: "false"
remain_after_exit: true
# Number of seconds to wait before process restart.
#
# Default: 30
restart_sec: 1
# User defined service name
#
# Default: none, required
some_service_2:
# Command to execute. Can be any command here which can be executed.
#
# Default: none, required.
command: "binary"
# Timeout for the process stop operation
#
# Default: 5 seconds
timeout_stop_sec: 5
# Env variables for the process
#
# Default: empty
env:
foo: "BAR"
foo2: "BAR2"
# Number of copies (processes) to start per command.
#
# Default: 1
process_num: 1
# Show the name of the service in logs (e.g. service.some_service_1)
#
# Default: false
service_name_in_log: false
# Allowed time before stop.
#
# Default: 0 (infinity), can be 1s, 2m, 2h (seconds, minutes, hours) and complex 2h2m1s.
exec_timeout: 0s
# Remain process after exit. In other words, restart process after exit with any exit code.
#
# Default: "false"
remain_after_exit: true
# Number of seconds to wait before process restart.
#
# Default: 30
restart_sec: 1
otel:
# OpenTelemetry Resources
#
# https://github.com/open-telemetry/opentelemetry-specification/blob/v1.25.0/specification/resource/semantic_conventions/README.md
resource:
# User's service name
#
# Default: RoadRunner
service_name: "rr_test"
# User's service version
#
# Default: RoadRunner
service_version: "1.0.0"
# User's service namespace
#
# Default: RoadRunner
service_namespace: "RR-Shop"
# User's service instance id
#
# Default: Generated UUID
service_instance_id: "UUID"
# Use insecure endpoint (http) or insecure gRPC
#
# Default: false
insecure: true
# Use gzip to compress the spans
#
# Default: false
compress: false
# Client to send the spans
#
# Default: http. Possible values: `http`, `grpc`
client: http
# Provides functionality to emit telemetry to consumers
#
# Default: otlp. Possible values: otlp (used for new_relic, datadog), zipkin stderr or stdout
exporter: otlp
# Used for the http client to override the default URL
#
# Default: empty
# custom_url: ""
# Consumer's endpoint
#
# Default: 127.0.0.1:4318
endpoint: "127.0.0.1:4318"
# HTTP plugin settings.
http:
# Host and port to listen on (eg.: `127.0.0.1:8080`).
#
# This option is required.
address: 127.0.0.1:8080
# override http error code for the internal RR errors
#
# Default: 500
internal_error_code: 505
# HTTP access logs
#
# Default: false
access_logs: false
# Maximal incoming request size in megabytes. Zero means no limit.
#
# Default: 0
max_request_size: 256
# Send raw body (unescaped) to the PHP worker for the application/x-www-form-urlencoded content type
#
# Optional, default: false
raw_body: false
# Middlewares for the http plugin, order is important. Allowed values is: "headers", "gzip", "static", "sendfile", [SINCE 2.6] -> "new_relic", [SINCE 2.6] -> "http_metrics", [SINCE 2.7] -> "cache"
#
# Default value: []
middleware: [ "headers", "gzip" ]
# Allow incoming requests only from the following subnets (https://en.wikipedia.org/wiki/Reserved_IP_addresses).
#
# Default: ["10.0.0.0/8", "127.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16", "::1/128", "fc00::/7", "fe80::/10"]
trusted_subnets:
[
"10.0.0.0/8",
"127.0.0.0/8",
"172.16.0.0/12",
"192.168.0.0/16",
"::1/128",
"fc00::/7",
"fe80::/10",
]
# File uploading settings.
uploads:
# Directory for file uploads. Empty value means to use $TEMP based on your OS.
#
# Default: ""
dir: "/tmp"
# Deny files with the following extensions to upload.
#
# Default: [".php", ".exe", ".bat"]
forbid: [ ".php", ".exe", ".bat", ".sh" ]
# [SINCE 2.6] Allow files with the following extensions to upload
#
# Default: empty
allow: [ ".html", ".aaa" ]
# Settings for "headers" middleware (docs: https://roadrunner.dev/docs/middleware-headers/2.x/en).
headers:
# Allows to control CORS headers. Additional headers "Vary: Origin", "Vary: Access-Control-Request-Method",
# "Vary: Access-Control-Request-Headers" will be added to the server responses. Drop this section for this
# feature disabling.
cors:
# Controls "Access-Control-Allow-Origin" header value (docs: https://mzl.la/2OgD4Qf).
#
# Default: empty
allowed_origin: "*"
# Controls "Access-Control-Allow-Origin" header value (docs: https://mzl.la/2OgD4Qf).
#
# Default: empty. If set, overrides allowed_origin.
allowed_origin_regex: "^https://foo"
# Controls "Access-Control-Allow-Headers" header value (docs: https://mzl.la/2OzDVvk).
#
# Default: ""
allowed_headers: "*"
# Controls "Access-Control-Allow-Methods" header value (docs: https://mzl.la/3lbwyXf).
#
# Default: ""
allowed_methods: "GET,POST,PUT,DELETE"
# Controls "Access-Control-Allow-Credentials" header value (docs: https://mzl.la/3ekJGaY).
#
# Default: false
allow_credentials: true
# Controls "Access-Control-Expose-Headers" header value (docs: https://mzl.la/3qAqgkF).
#
# Default: ""
exposed_headers: "Cache-Control,Content-Language,Content-Type,Expires,Last-Modified,Pragma"
# Controls "Access-Control-Max-Age" header value in seconds (docs: https://mzl.la/2PCSdvt).
#
# Default: 0
max_age: 600
# Automatically add headers to every request passed to PHP.
#
# Default: <empty map>
request:
input: "custom-header"
# Automatically add headers to every response.
#
# Default: <empty map>
response:
X-Powered-By: "RoadRunner"
# Settings for "static" middleware (docs: https://roadrunner.dev/docs/middleware-static/2.x/en).
static:
# Path to the directory to serve
#
# Default: "." (current)
dir: "."
# File patterns to forbid
#
# Default: empty
forbid: [ ]
# Etag calculation (base on the body CRC32)
#
# Default: false
calculate_etag: false
# Weak etag calculation (based only on the content-length CRC32)
#
# Default: false
weak: false
# Patterns to allow
#
# Default: empty
allow: [ ".txt", ".php" ]
# Request headers
#
# Default: empty
request:
input: "custom-header"
# Response headers
#
# Default: empty
response:
output: "output-header"
# Workers pool settings.
pool:
# Debug mode for the pool. In this mode, pool will not pre-allocate the worker. Worker (only 1, num_workers ignored) will be allocated right after the request arrived.
#
# Default: false
debug: false
# Override server's command
#
# Default: empty
command: "php my-super-app.php"
# How many worker processes will be started. Zero (or nothing) means the number of logical CPUs.
#
# Default: 0
num_workers: 0
# Maximal count of worker executions. Zero (or nothing) means no limit.
#
# Default: 0
max_jobs: 0
# [2023.3.10]
# Maximum size of the internal requests queue. After reaching the limit, all additional requests would be rejected with error.
#
# Default: 0 (no limit)
max_queue_size: 0
# Timeout for worker allocation. Zero means 60s.
#
# Default: 60s
allocate_timeout: 60s
# Timeout for the reset timeout. Zero means 60s.
#
# Default: 60s
reset_timeout: 60s
# Timeout for the stream cancellation. Zero means 60s.
#
# Default: 60s
stream_timeout: 60s
# Timeout for worker destroying before process killing. Zero means 60s.
#
# Default: 60s
destroy_timeout: 60s
# Dynamic allocator settings.
#
# Default: empty
dynamic_allocator:
max_workers: 25
spawn_rate: 10
idle_timeout: 10s
# Supervisor is used to control http workers (previous name was "limit", video: https://www.youtube.com/watch?v=NdrlZhyFqyQ).
# "Soft" limits will not interrupt current request processing. "Hard"
# limit on the contrary - interrupts the execution of the request.
supervisor:
# How often to check the state of the workers.
#
# Default: 5s
watch_tick: 5s
# Maximum time worker is allowed to live (soft limit). Zero means no limit.
#
# Default: 0s
ttl: 0s
# How long worker can spend in IDLE mode after first using (soft limit). Zero means no limit.
#
# Default: 0s
idle_ttl: 10s
# Maximal worker memory usage in megabytes (soft limit). Zero means no limit.
#
# Default: 0
max_worker_memory: 128
# Maximal job lifetime (hard limit). Zero means no limit.
#
# Default: 0s
exec_ttl: 60s
# SSL (Secure Sockets Layer) (TLS) settings (docs: https://roadrunner.dev/docs/app-server-https/2.x/en).
ssl:
# Host and port to listen on (eg.: `127.0.0.1:443`).
#
# Default: ":443"
address: "127.0.0.1:443"
# Use ACME certificates provider (Let's encrypt)
# Must not be specified if key + cert is used.
acme:
# Directory to use as a certificate/pk, account info storage
#
# Optional. Default: rr_cache
cache_dir: "rr_le_certs"
# User email
#
# Used to create LE account. Mandatory. Error on empty.
email: your-email-here@email
# Alternate port for the http challenge. Challenge traffic should be redirected to this port if overridden.
#
# Optional. Default: 80
alt_http_port: 80
# Alternate port for the tls-alpn-01 challenge. Challenge traffic should be redirected to this port if overridden.
#
# Optional. Default: 443.
alt_tlsalpn_port: 443
# Challenge types
#
# Optional. Default: http-01. Possible values: http-01, tlsalpn-01
challenge_type: http-01
# Use production or staging endpoint. NOTE, try to use staging endpoint to make sure, that everything works correctly.
#
# Optional, but for production should be set to true. Default: false
use_production_endpoint: true
# List of your domains to obtain certificates
#
# Mandatory. Error on empty.
domains: [
"your-cool-domain.here",
"your-second-domain.here"
]
# Automatic redirect from http:// to https:// schema.
#
# Default: false
redirect: true
# Path to the cert file. This option is required for SSL. Must not be specified if ACME is used.
#
# This option is required.
# cert: "/ssl/cert.crt"
# Path to the cert key file. Must not be specified if ACME is used.
#
# This option is required.
# key: "/ssl/key.pem"
# Path to the root certificate authority file.
#
# This option is optional (required for the mTLS). Must not be specified if ACME is used.
# root_ca: "/ssl/ca.crt"
# Client auth type (mTLS). Must not be specified if ACME is used.
#
# This option is optional. Default value: no_client_certs. Possible values: request_client_cert, require_any_client_cert, verify_client_cert_if_given, require_and_verify_client_cert, no_client_certs
# client_auth_type: no_client_certs
# FastCGI frontend support.
fcgi:
# FastCGI connection DSN. Supported TCP and Unix sockets. An empty value disables this.
#
# Default: ""
address: tcp://0.0.0.0:7921
# HTTP/2 settings.
http2:
# HTTP/2 over non-encrypted TCP connection using H2C.
#
# Default: false
h2c: false
# Maximal concurrent streams count.
#
# Default: 128
max_concurrent_streams: 128
# HTTP/3 settings (experimental). Enable QUIC + HTTP/3 on a separate (optional) address.
# Provide key+cert here if ACME is not configured (same as for the TLS section above).
http3:
# Host and port to listen on for HTTP/3.
#
# Default: disabled (section absent)
address: 127.0.0.1:8443
# Path to the certificate (must be provided together with the key if section enabled).
# cert: "/ssl/cert.crt"
# Path to the private key.
# key: "/ssl/key.pem"
# Redis section.
redis:
# UniversalClient is an abstract client which - based on the provided options -
# can connect to either clusters, or sentinel-backed failover instances
# or simple single-instance servers. This can be useful for testing
# cluster-specific applications locally.
# if the number of addrs is 1 and master_name is empty, a single-node redis Client will be returned
# if the number of addrs is two or more, a ClusterClient will be returned
addrs:
- "localhost:6379"
# if a MasterName is passed a sentinel-backed FailoverClient will be returned
master_name: ""
username: ""
password: ""
db: 0
sentinel_password: ""
route_by_latency: false
route_randomly: false
dial_timeout: 0s # accepted values [1s, 5m, 3h]
max_retries: 1
min_retry_backoff: 0s # accepted values [1s, 5m, 3h]
max_retry_backoff: 0s # accepted values [1s, 5m, 3h]
pool_size: 0
min_idle_conns: 0
max_conn_age: 0s # accepted values [1s, 5m, 3h]
read_timeout: 0s # accepted values [1s, 5m, 3h]
write_timeout: 0s # accepted values [1s, 5m, 3h]
pool_timeout: 0s # accepted values [1s, 5m, 3h]
idle_timeout: 0s # accepted values [1s, 5m, 3h]
idle_check_freq: 0s # accepted values [1s, 5m, 3h]
read_only: false
# Optional TLS configuration for Redis (leave section absent to disable TLS).
# tls:
# # Path to the CA certificate (required if section enabled).
# root_ca: "/ssl/ca.crt"
# # (Optional) Client certificate + key if mTLS required.
# # cert: "/ssl/cert.crt"
# # key: "/ssl/key.pem"
# # client_auth_type: no_client_certs
# Application metrics in Prometheus format (docs: https://roadrunner.dev/docs/plugins-metrics/2.x/en). Drop this section
# for this feature disabling.
metrics:
# Prometheus client address (path /metrics added automatically).
#
# Default: "127.0.0.1:2112"
address: "127.0.0.1:2112"
# Application-specific metrics (published using an RPC connection to the server).
collect:
app_metric_summary:
type: summary
help: "Custom summary application metric"
labels: [ "type" ]
# Objectives defines the quantile rank estimates with their respective absolute error (for summary only).
objectives:
0.1: 2.3
1.0: 1.4
app_metric_histogram:
type: histogram
help: "Custom histogram application metric"
labels: [ "type" ]
buckets: [ 0.1, 0.2, 0.3, 1.0 ]
# Health check endpoint (docs: https://roadrunner.dev/docs/app-server-health/2.x/en). If response code is 200 - it means at
# least one worker ready to serve requests. 500 - there are no workers ready to service requests.
# Drop this section for this feature disabling.
status:
# Host and port to listen on (eg.: `127.0.0.1:2114`). Use the following URL: http://127.0.0.1:2114/health?plugin=http
# Multiple plugins must be separated using "&" - http://127.0.0.1:2114/health?plugin=http&plugin=rpc where "http" and
# "rpc" are active (connected) plugins.
#
# This option is required.
address: 127.0.0.1:2114
# Response status code if a requested plugin not ready to handle requests
# Valid for both /health and /ready endpoints
#
# Default: 503
unavailable_status_code: 503
# Maximum duration (in seconds) to wait for a complete response from the queried plugin(s).
# If the plugin does not respond within this time RR returns `unavailable_status_code`.
#
# Default: 60
check_timeout: 60
# Automatically detect PHP file changes and reload connected services
# (docs: https://roadrunner.dev/docs/plugins-reload/2.x/en). Drop this section for this feature disabling.
reload:
# Sync interval.
#
# Default: "1s"
interval: 1s
# Global patterns to sync.
#
# Default: [".php"]
patterns: [ ".php" ]
# List of included for sync services (this is a map, where key name is a plugin name).
#
# Default: <empty map>
services:
http:
# Directories to sync. If recursive is set to true, recursive sync will be applied only to the directories in
# "dirs" section. Dot (.) means "current working directory".
#
# Default: []
dirs: [ "." ]
# Recursive search for file patterns to add.
#
# Default: false
recursive: true
# Ignored folders.
#
# Default: []
ignore: [ "vendor" ]
# Service specific file pattens to sync.
#
# Default: []
patterns: [ ".php", ".go", ".md" ]
# NATS jobs driver
#
# Default: nats://127.0.0.1:4222
nats:
addr: "demo.nats.io"
# AMQP jobs driver
#
# This option is required to use AMQP driver
amqp:
# AMQP Uri to connect to the rabbitmq server https://www.rabbitmq.com/uri-spec.html
#
# This option is required for the production. Default: amqp(s)://guest:guest@127.0.0.1:5672
addr: amqp://guest:guest@127.0.0.1:5672/
# AMQPS TLS configuration
#
# This section is optional
tls:
# Path to the key file
#
# This option is required
key: "/ssl/key.pem"
# Path to the certificate
#
# This option is required
cert: "/ssl/cert.crt"
# Path to the CA certificate, defines the set of root certificate authorities that servers use if required to verify a client certificate. Used with the `client_auth_type` option.
#
# This option is optional
root_ca: "/ssl/ca.crt"
# Client auth type (mTLS, peer verification).
#
# This option is optional. Default value: no_client_certs. Possible values: request_client_cert, require_any_client_cert, verify_client_cert_if_given, require_and_verify_client_cert, no_client_certs
client_auth_type: no_client_certs
# Beanstalk jobs driver
#
# This option is required to use Beanstalk driver
beanstalk:
# Beanstalk address
#
# This option is required for the production. Default: tcp://127.0.0.1:11300
addr: tcp://127.0.0.1:11300
# Beanstalk connect timeout.
#
# Default: 30s
timeout: 10s
# SQS jobs driver (https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html)
#
# This option is required to use SQS driver
sqs:
# AccessKey ID
#
# This option is required for the production. Default: empty
key: api-key
# Secret access key
#
# This option is required for the production. Default: empty
secret: api-secret
# AWS region
#
# This option is required for the production. Default: empty
region: us-west-1
# AWS session token
#
# This option is required for the production. Default: empty
session_token: test
# AWS SQS endpoint to connect
#
# This option is required for the production. Default: http://127.0.0.1:9324
endpoint: http://127.0.0.1:9324
# Kafka jobs driver
#
# This option is required to use Kafka driver,
kafka:
# Kafka brokers addresses
#
# Required to use Kafka driver
brokers: [ "127.0.0.1:9092", "127.0.0.1:9002" ]
# SSL/TLS configuration
#
# Optional, default: empty
tls:
# Secure connection timeout
#
# Examples: "2s", "5m"
# Optional, default: "10s"
timeout: "10s"
# Path to the key file
#
# This option is required
key: "/ssl/key.pem"
# Path to the certificate
#
# This option is required
cert: "/ssl/cert.crt"
# Path to the CA certificate, defines the set of root certificate authorities that servers use if required to verify a client certificate. Used with the `client_auth_type` option.
#
# This option is optional
root_ca: "/ssl/ca.crt"
# Client auth type.
#
# This option is optional. Default value: no_client_certs. Possible values: request_client_cert, require_any_client_cert, verify_client_cert_if_given, require_and_verify_client_cert, no_client_certs
client_auth_type: no_client_certs
# SASL authentication options to use for all connections. Depending on the auth type, plain/SCRAM or aws_msk_plain sections should be removed.
#
# Optional, default: empty
sasl:
# ----------- 1. PLAIN and SCRAM auth section ---------------
# Mechanism used for the authentication
#
# Required for the section. Might be: 'aws_msk_iam', 'plain', 'SCRAM-SHA-256', 'SCRAM-SHA-512'
mechanism: plain
# Username to use for authentication.
#
# Required for the plain auth mechanism.
username: foo
# Password to use for authentication.
#
# Required for the plain auth mechanism.
password: bar
# Nonce.
#
# Optional for the SHA auth types. Empty by default.
nonce: "foo"
# If true, suffixes the "tokenauth=true" extra attribute to the initial authentication message.
# Set this to true if the user and pass are from a delegation token.
# Optional for the SHA auth types. Empty by default.
is_token: false
# Zid is an optional authorization ID to use in authenticating.
#
# Optional, default: empty.
zid: "foo"
# -------------- 2. AWS_MSK_IAM auth section ------------------
# AWS Access key ID.
#
# Required
access_key: foo
# AWS Secret Access Key.
#
#
secret_key: bar
# SessionToken, if non-empty, is a session / security token to use for authentication.
# See the following link for more details:
#
# https://docs.aws.amazon.com/STS/latest/APIReference/welcome.html
session_token: bar
# UserAgent is the user agent to for the client to use when connecting
# to Kafka, overriding the default "franz-go/<runtime.Version()>/<hostname>".
# Setting a UserAgent allows authorizing based on the aws:UserAgent
# condition key; see the following link for more details:
# https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-useragent
user_agent: baz
jobs:
# Number of threads which will try to obtain the job from the priority queue
#
# Default: number of the workers + 1
num_pollers: 32
# Push operation timeout in seconds
#
# Default: 60
timeout: 60
# Size of the internal priority queue
#
# Default: 1_000_000
pipeline_size: 100000
# worker pool configuration
pool:
# Debug mode for the pool. In this mode, pool will not pre-allocate the worker. Worker (only 1, num_workers ignored) will be allocated right after the request arrived.
#
# Default: false
debug: false
# Override server's command
#
# Default: empty
command: "php my-super-app.php"
# How many worker processes will be started. Zero (or nothing) means the number of logical CPUs.
#
# Default: 0
num_workers: 0
# Maximal count of worker executions. Zero (or nothing) means no limit.
#
# Default: 0
max_jobs: 0
# [2023.3.10]
# Maximum size of the internal requests queue. After reaching the limit, all additional requests would be rejected with error.
#
# Default: 0 (no limit)
max_queue_size: 0
# Timeout for worker allocation. Zero means 60s.
#
# Default: 60s
allocate_timeout: 60s
# Timeout for the reset timeout. Zero means 60s.
#
# Default: 60s
reset_timeout: 60s
# Timeout for the stream cancellation. Zero means 60s.
#
# Default: 60s
stream_timeout: 60s
# Timeout for worker destroying before process killing. Zero means 60s.
#
# Default: 60s
destroy_timeout: 60s
dynamic_allocator:
max_workers: 25
spawn_rate: 10
idle_timeout: 10s
# List of broker pipelines associated with the drivers.
#
# This option is not required since you can declare pipelines in the runtime. Pipeline driver should exist.
pipelines:
# Pipeline name
#
# This option is required when defining pipelines via configuration.
test-local:
# Driver associated with the pipeline
#
# This option is required. Possible values: amqp, memory, sqs, beanstalk, boltdb
driver: memory
# Driver's configuration
#
# Should not be empty
config:
# Pipeline priority
#
# If the job has priority set to 0, it will inherit the pipeline's priority. Default: 10.
priority: 10
# Number of job to prefetch from the driver until ACK/NACK.
#
# Default: 100_000.
prefetch: 10000
# Pipeline name
#
# This option is required when defining pipelines via configuration.
test-local-1:
# Driver associated with the pipeline
#
# This option is required. Possible values: amqp, memory, sqs, beanstalk, boltdb
driver: boltdb
# Driver's configuration
#
# Should not be empty
config:
# Number of job to prefetch from the driver.
#
# Default: 100_000.
prefetch: 10000
# Pipeline priority
#
# If the job has priority set to 0, it will inherit the pipeline's priority. Default: 10.
priority: 10
# BoldDB file to create or DB to use
#
# Default: "rr.db"
file: "path/to/rr.db"
# Permissions for the boltdb database file
#
# This option is optional. Default: 0755
permissions: 0755
test-local-2:
# Driver name
#
# This option is required.
driver: amqp
# Driver's configuration
#
# Should not be empty
config:
# QoS - prefetch.
#
# Default: 10
prefetch: 10
# Pipeline priority
#
# If the job has priority set to 0, it will inherit the pipeline's priority. Default: 10.
priority: 1
# Durable queue
#
# Default: false
durable: false
# Durable exchange (rabbitmq option: https://www.rabbitmq.com/tutorials/amqp-concepts.html#exchanges)
#
# Default: false
exchange_durable: false
# Auto-delete (exchange is deleted when last queue is unbound from it): https://www.rabbitmq.com/tutorials/amqp-concepts.html#exchanges
#
# Default: false
exchange_auto_delete: false
# Auto-delete (queue that has had at least one consumer is deleted when last consumer unsubscribes) (rabbitmq option: https://www.rabbitmq.com/queues.html#properties)
#
# Default: false
queue_auto_delete: false
# Delete queue when stopping the pipeline
#
# Default: false
delete_queue_on_stop: false
# Queue name
#
# Default: default
queue: test-1-queue
# Exchange name
#
# Default: amqp.default
exchange: default
# Redial timeout (in seconds). How long to try to reconnect to the AMQP server.
#
# Default: 60
redial_timeout: 60
# Exchange type
#
# Default: direct.
exchange_type: direct
# Routing key for the queue
#
# Default: empty.
routing_key: test
# Declare a queue exclusive at the exchange
#
# Default: false
exclusive: false
# When multiple is true, this delivery and all prior unacknowledged deliveries
# on the same channel will be acknowledged. This is useful for batch processing
# of deliveries
#
# Default: false
multiple_ack: false
# The consumer_id is identified by a string that is unique and scoped for all consumers on this channel.
#
# Default: "roadrunner" + uuid.
consumer_id: "roadrunner-uuid"
# Use rabbitmq mechanism to requeue the job on fail
#
# Default: false
requeue_on_fail: false
# Queue headers
#
# Default: null
queue_headers:
x-queue-mode: lazy
test-local-3:
# Driver name
#
# This option is required.
driver: beanstalk
# Driver's configuration
#
# Should not be empty
config:
# Pipeline priority
#
# Default
priority: 11
# Beanstalk internal tube priority
#
# Default: 1
tube_priority: 1
# Tube name
#
# Default: default
tube: default-1
# If no job is available before this timeout has passed, Reserve returns a ConnError recording ErrTimeout.
#
# Default: 5s
reserve_timeout: 10s
test-local-4:
# Driver name
#
# This option is required.
driver: sqs
# Driver's configuration
#
# Should not be empty
config:
# Pipeline priority
#
# If the job has priority set to 0, it will inherit the pipeline's priority. Default: 10.
priority: 10
# Number of jobs to prefetch from the SQS until ACK/NACK.
#
# Default: 10
prefetch: 10
# Get queue URL only
#
# Default: false
skip_queue_declaration: false
# The duration (in seconds) that the received messages are hidden from subsequent
# retrieve requests after being retrieved by a ReceiveMessage request
#
# Default: 0
visibility_timeout: 0
# The duration (in seconds) for which the call waits for a message to arrive
# in the queue before returning. If a message is available, the call returns
# sooner than WaitTimeSeconds. If no messages are available and the wait time
# expires, the call returns successfully with an empty list of messages.
#
# Default: 0
wait_time_seconds: 0
# Queue name.
#
# Default: default
queue: default
# Message group ID: https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html#SQS-SendMessage-request-MessageGroupId
#
# Default: empty, should be set if FIFO queue is used
message_group_id: "test"
# List of the AWS SQS attributes https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SetQueueAttributes.html.
attributes:
DelaySeconds: 0
MaximumMessageSize: 262144
MessageRetentionPeriod: 345600
ReceiveMessageWaitTimeSeconds: 0
VisibilityTimeout: 30
# Tags don't have any semantic meaning. Amazon SQS interprets tags as character
# strings.
tags:
test: "tag"
test-local-5:
# Driver name
#
# This option is required
driver: nats
# Driver's configuration
#
# Should not be empty
config:
# Pipeline priority
#
# If the job has priority set to 0, it will inherit the pipeline's priority. Default: 10.
priority: 2
# NATS prefetch
#
# Messages to read into the channel
prefetch: 100
# NATS subject
#
# Default: default
subject: default
# NATS stream
#
# Default: default-stream
stream: foo
# The consumer will only start receiving messages that were created after the consumer was created
#
# Default: false (deliver all messages from the stream beginning)
deliver_new: true
# Consumer rate-limiter in bytes https://docs.nats.io/jetstream/concepts/consumers#ratelimit
#
# Default: 1000
rate_limit: 100
# Delete the stream when after pipeline was stopped
#
# Default: false
delete_stream_on_stop: false
# Delete message from the stream after successful acknowledge
#
# Default: false
delete_after_ack: false
test-local-6:
# Driver name
#
# This option is required
driver: kafka
# Driver's configuration
#
# Should not be empty
config:
# Pipeline priority
#
# If the job has priority set to 0, it will inherit the pipeline's priority. Default: 10.
priority: 1
# Auto create topic for the consumer/producer
#
# Optional, default: false
auto_create_topics_enable: false
# Kafka producer options
#
# Optional, required only if Push/PushBatch is used.
producer_options:
# disable_idempotent disables idempotent produce requests, opting out of
# Kafka server-side deduplication in the face of reissued requests due to
# transient network problems.
# Idempotent production is strictly a win, but does require the IDEMPOTENT_WRITE permission on CLUSTER
# (pre Kafka 3.0), and not all clients can have that permission.
#
# Optional, defaut: false
disable_idempotent: false
# required_acks sets the required acks for produced records.
#
# Optional, default: AllISRAcks. Possible values: NoAck, LeaderAck, AllISRAck
required_acks: AllISRAck
# max_message_bytes upper bounds the size of a record batch, overriding the default 1,000,012 bytes.
# This mirrors Kafka's max.message.bytes.
#
# Optional, default: 1000012
max_message_bytes: 1000012
# request_timeout sets how long Kafka broker's are allowed to respond produce requests, overriding the default 10s.
# If a broker exceeds this duration, it will reply with a request timeout error.
#
# Optional, default: 10s. Possible values: 10s, 10m.
request_timeout: 10s
# delivery_timeout sets a rough time of how long a record can sit around in a batch before timing out,
# overriding the unlimited default. If idempotency is enabled (as it is by default), this option is only
# enforced if it is safe to do so without creating invalid sequence numbers.
#
# Optional, default: delivery.timeout.ms Kafka option. Possible values: 10s, 10m.
delivery_timeout: 100s
# transaction_timeout sets the allowed for a transaction, overriding the default 40s. It is a good idea to
# keep this less than a group's session timeout.
#
# Optional, default 40s. Possible values: 10s, 10m.
transaction_timeout: 100s
# compression_codec sets the compression codec to use for producing records.
#
# Optional, default is chosen in the order preferred based on broker support. Possible values: gzip, snappy, lz4, zstd.
compression_codec: gzip
# Partitioning strategy to use. Possible values: Manual, Uniform, RoundRobin, LeastBackup, Sticky.
# Default (if omitted): Uniform
partitioning_strategy: Uniform
# Kafka Consumer options. Needed to consume messages from the Kafka cluster.
#
# Optional, needed only if `consume` is used.
consumer_options:
# topics: adds topics to use for consuming
#
# Default: empty (will produce an error), possible to use regexp if `consume_regexp` is set to true.
topics: [ "foo", "bar", "^[a-zA-Z0-9._-]+$" ]
# consume_regexp sets the client to parse all topics passed to `topics` as regular expressions.
# When consuming via regex, every metadata request loads *all* topics, so that all topics can be passed to
# any regular expressions. Every topic is evaluated only once ever across all regular expressions; either it
# permanently is known to match, or is permanently known to not match.
#
# Optional, default: false.
consume_regexp: true
# max_fetch_message_size sets the maximum amount of bytes a broker will try to send during a fetch, overriding the default 50MiB.
# Note that brokers may not obey this limit if it has records larger than this limit.
# Also note that this client sends a fetch to each broker concurrently, meaning the client will
# buffer up to <brokers * max bytes> worth of memory. This corresponds to the Java fetch.max.bytes setting.
#
# Optional, default 50000
max_fetch_message_size: 50000
# min_fetch_message_size sets the minimum amount of bytes a broker will try to send during a fetch,
# overriding the default 1 byte. With the default of 1, data is sent as soon as it is available.
# This corresponds to the Java fetch.min.bytes setting.
#
# Optional, default: 1.
min_fetch_message_size: 1
# consume_partitions sets partitions to consume from directly and the offsets to start consuming those partitions from.
# This option is basically a way to explicitly consume from subsets of partitions in topics, or to consume at exact offsets.
#
# NOTE: This option is not compatible with group consuming and regex consuming.
#
# Optional, default: null
consume_partitions:
# Topic for the consume_partitions
#
# Required at least one topic.
foo:
# Partition for the topic.
#
# Required at least one partition.
0:
# Partition offset.
#
# Required if all options is used. No default, error on empty.
# Possible values: AtEnd, At, AfterMilli, AtStart, Relative, WithEpoch
type: AtStart
# Value for the: At, AfterMilli, Relative and WithEpoch offsets.
#
# Optional, default: 0.
value: 1
# consumer_offset sets the offset to start consuming from, or if OffsetOutOfRange is seen while fetching,
# to restart consuming from.
#
# Optional, default: AtStart
consumer_offset:
# Partition offset.
#
# Optional, default: AtStart. Possible values: AtEnd, At, AfterMilli, AtStart, Relative, WithEpoch
type: AtStart
# Value for the: At, AfterMilli, Relative and WithEpoch offsets.
#
# Optional, default: 0.
value: 1
# group_options sets the consumer group for the client to join and consume in.
# This option is required if using any other group options.
#
# Default: empty.
group_options:
# group_id sets the group to consume.
#
# Required if using group consumer.
group_id: foo
# block_rebalance_on_poll switches the client to block rebalances whenever you poll.
#
# Optional, default: false.
block_rebalance_on_poll: true
# InstanceID switches the group member from dynamic to static membership.
# Optional.
# instance_id: rr-instance-1
# SASL options specific for this pipeline (optional). If omitted, global driver SASL settings are used.
sasl_options:
mechanism: plain
username: foo
password: bar
# list of pipelines to be consumed by the server automatically at the start, keep empty if you want to start consuming manually
consume:
[
"test-local",
"test-local-1",
"test-local-2",
"test-local-3",
"test-local-4",
"test-local-5",
"test-local-6",
]
grpc:
# GRPC address to listen
#
# This option is required
listen: "tcp://127.0.0.1:9001"
# Proto file to use, multiply files supported [SINCE 2.6]. As of v2023.1.4, wilcards are allowed in the proto field.
#
# This option is required
proto:
- "*.proto" # wilcard
- "first.proto"
- "second.proto"
# GRPC TLS configuration
#
# This section is optional
tls:
# Path to the key file
#
# This option is required
key: "/ssl/key.pem"
# Path to the certificate
#
# This option is required
cert: "/ssl/cert.crt"
# Path to the CA certificate, defines the set of root certificate authorities that servers use if required to verify a client certificate. Used with the `client_auth_type` option.
#
# This option is optional
root_ca: "/ssl/ca.crt"
# Client auth type.
#
# This option is optional. Default value: no_client_certs. Possible values: request_client_cert, require_any_client_cert, verify_client_cert_if_given, require_and_verify_client_cert, no_client_certs
client_auth_type: no_client_certs
# Maximum send message size
#
# This option is optional. Default value: 50 (MB)
max_send_msg_size: 50
# Maximum receive message size
#
# This option is optional. Default value: 50 (MB)
max_recv_msg_size: 50
# MaxConnectionIdle is a duration for the amount of time after which an
# idle connection would be closed by sending a GoAway. Idleness duration is
# defined since the most recent time the number of outstanding RPCs became
# zero or the connection establishment.
#
# This option is optional. Default value: infinity.
# Can be 1s, 2m, 2h (seconds, minutes, hours) and complex 2h2m1s.
max_connection_idle: 0s
# MaxConnectionAge is a duration for the maximum amount of time a
# connection may exist before it will be closed by sending a GoAway. A
# random jitter of +/-10% will be added to MaxConnectionAge to spread out
# connection storms.
#
# This option is optional. Default value: infinity.
# Can be 1s, 2m, 2h (seconds, minutes, hours) and complex 2h2m1s.
max_connection_age: 0s
# MaxConnectionAgeGrace is an additive period after MaxConnectionAge after
# which the connection will be forcibly closed.
# Can be 1s, 2m, 2h (seconds, minutes, hours) and complex 2h2m1s.
max_connection_age_grace: 8h
# MaxConnectionAgeGrace is an additive period after MaxConnectionAge after
# which the connection will be forcibly closed.
#
# This option is optional: Default value: 10
max_concurrent_streams: 10
# After a duration of this time if the server doesn't see any activity it
# pings the client to see if the transport is still alive.
# If set below 1s, a minimum value of 1s will be used instead.
#
# This option is optional. Default value: 2h
# Can be 1s, 2m, 2h (seconds, minutes, hours) and complex 2h2m1s.
ping_time: 1s
# After having pinged for keepalive check, the server waits for a duration
# of Timeout and if no activity is seen even after that the connection is
# closed.
#
# This option is optional. Default value: 20s
# Can be 1s, 2m, 2h (seconds, minutes, hours) and complex 2h2m1s.
timeout: 200s
# Usual workers pool configuration
pool:
# Debug mode for the pool. In this mode, pool will not pre-allocate the worker. Worker (only 1, num_workers ignored) will be allocated right after the request arrived.
#
# Default: false
debug: false
# Override server's command
#
# Default: empty
command: "php my-super-app.php"
# How many worker processes will be started. Zero (or nothing) means the number of logical CPUs.
#
# Default: 0
num_workers: 0
# Maximal count of worker executions. Zero (or nothing) means no limit.
#
# Default: 0
max_jobs: 0
# [2023.3.10]
# Maximum size of the internal requests queue. After reaching the limit, all additional requests would be rejected with error.
#
# Default: 0 (no limit)
max_queue_size: 0
# Timeout for worker allocation. Zero means 60s.
#
# Default: 60s
allocate_timeout: 60s
# Timeout for the reset timeout. Zero means 60s.
#
# Default: 60s
reset_timeout: 60s
# Timeout for the stream cancellation. Zero means 60s.
#
# Default: 60s
stream_timeout: 60s
# Timeout for worker destroying before process killing. Zero means 60s.
#
# Default: 60s
destroy_timeout: 60s
# [SINCE 2.6] TCP plugin
tcp:
# The list of TCP servers to start. There are can be any number of servers you want to allocate.
servers:
# Server name. Can be any string. Will be sent to the worker in the context.
#
# Default: none.
server1:
# Address to listen.
#
# Error if empty.
addr: 127.0.0.1:7778
# Data packets delimiter. Every send should end either with EOF or with the delimiter.
#
# Default: CRLF (\r\n)
delimiter: "\r\n"
server2:
addr: 127.0.0.1:8811
server3:
addr: 127.0.0.1:8812
delimiter: "\r\n"
# Chunks that RR uses to read the data. In MB. If you expect big payloads on a TCP server, to reduce `read` syscalls, would be a good practice to use a fairly big enough buffer.
#
# Default: 1MB
read_buf_size: 10
# The worker pool to use for the TCP service.
pool:
# Debug mode for the pool. In this mode, pool will not pre-allocate the worker. Worker (only 1, num_workers ignored) will be allocated right after the request arrived.
#
# Default: false
debug: false
# Override server's command
#
# Default: empty
command: "php my-super-app.php"
# How many worker processes will be started. Zero (or nothing) means the number of logical CPUs.
#
# Default: 0
num_workers: 0
# Maximal count of worker executions. Zero (or nothing) means no limit.
#
# Default: 0
max_jobs: 0
# [2023.3.10]
# Maximum size of the internal requests queue. After reaching the limit, all additional requests would be rejected with error.
#
# Default: 0 (no limit)
max_queue_size: 0
# Timeout for worker allocation. Zero means 60s.
#
# Default: 60s
allocate_timeout: 60s
# Timeout for the reset timeout. Zero means 60s.
#
# Default: 60s
reset_timeout: 60s
# Timeout for the stream cancellation. Zero means 60s.
#
# Default: 60s
stream_timeout: 60s
# Timeout for worker destroying before process killing. Zero means 60s.
#
# Default: 60s
destroy_timeout: 60s
# [SINCE 2.6] Fileserver to serve static files.
fileserver:
# File server address
#
# Error on empty
address: 127.0.0.1:10101
# Etag calculation. Request body CRC32.
#
# Default: false
calculate_etag: true
# Weak etag calculation
#
# Default: false
weak: false
# Enable body streaming for the files more than 4KB
#
# Default: false
stream_request_body: true
serve:
# HTTP prefix
#
# Error on empty
- prefix: "/foo"
# Directory to serve
#
# Default: "."
root: "../../../tests"
# When set to true, the server tries minimizing CPU usage by caching compressed files
#
# Default: false
compress: false
# Expiration duration for inactive file handlers. Units: seconds.
#
# Default: 10, use a negative value to disable it.
cache_duration: 10
# The value for the Cache-Control HTTP-header. Units: seconds
#
# Default: 10 seconds
max_age: 10
# Enable range requests
# https://developer.mozilla.org/en-US/docs/Web/HTTP/Range_requests
#
# Default: false
bytes_range: true
- prefix: "/foo/bar"
root: "../../../tests"
compress: false
cache_duration: 10
max_age: 10
bytes_range: true
# Centrifugo server plugin
#
# Docs: https://centrifugal.dev/
centrifuge:
# Centrifugo server proxy address (docs: https://centrifugal.dev/docs/server/proxy#grpc-proxy)
#
# Optional, default: tcp://127.0.0.1:30000
proxy_address: "tcp://127.0.0.1:30000"
# gRPC server API address (docs: https://centrifugal.dev/docs/server/server_api#grpc-api)
#
# Optional, default: tcp://127.0.0.1:10000. Centrifugo: `grpc_api` should be set to true and `grpc_port` should match this value.
grpc_api_address: tcp://127.0.0.1:10000
# Use gRPC gzip compressor
#
# Optional, default: false
use_compressor: true
# Your application version
#
# Optional, default: v1.0.0
version: "v1.0.0"
# Your application name
#
# Optional, default: roadrunner
name: "roadrunner"
# Workers pool settings.
pool:
# Debug mode for the pool. In this mode, pool will not pre-allocate the worker. Worker (only 1, num_workers ignored) will be allocated right after the request arrived.
#
# Default: false
debug: false
# Override server's command
#
# Default: empty
command: "php my-super-app.php"
# How many worker processes will be started. Zero (or nothing) means the number of logical CPUs.
#
# Default: 0
num_workers: 0
# Maximal count of worker executions. Zero (or nothing) means no limit.
#
# Default: 0
max_jobs: 0
# [2023.3.10]
# Maximum size of the internal requests queue. After reaching the limit, all additional requests would be rejected with error.
#
# Default: 0 (no limit)
max_queue_size: 0
# Timeout for worker allocation. Zero means 60s.
#
# Default: 60s
allocate_timeout: 60s
# Timeout for the reset timeout. Zero means 60s.
#
# Default: 60s
reset_timeout: 60s
# Timeout for the stream cancellation. Zero means 60s.
#
# Default: 60s
stream_timeout: 60s
# Timeout for worker destroying before process killing. Zero means 60s.
#
# Default: 60s
destroy_timeout: 60s
# Supervisor is used to control http workers (previous name was "limit", video: https://www.youtube.com/watch?v=NdrlZhyFqyQ).
# "Soft" limits will not interrupt current request processing. "Hard"
# limit on the contrary - interrupts the execution of the request.
supervisor:
# How often to check the state of the workers.
#
# Default: 5s
watch_tick: 5s
# Maximum time worker is allowed to live (soft limit). Zero means no limit.
#
# Default: 0s
ttl: 0s
# How long worker can spend in IDLE mode after first using (soft limit). Zero means no limit.
#
# Default: 0s
idle_ttl: 10s
# Maximal worker memory usage in megabytes (soft limit). Zero means no limit.
#
# Default: 0
max_worker_memory: 128
# Maximal job lifetime (hard limit). Zero means no limit.
#
# Default: 0s
exec_ttl: 60s
# TLS configuration
#
# Optional, default: null
tls:
# TLS key
#
# Required
key: "/ssl/key.pem"
# TLS certificate
#
# Required
cert: "/ssl/cert.crt"
## RoadRunner internal container configuration (docs: https://github.com/spiral/endure).
endure:
# How long to wait for stopping.
#
# Default: 30s
grace_period: 30s
# Print graph in the graphviz format to the stdout (paste here to visualize https://dreampuf.github.io)
#
# Default: false
print_graph: false
# Logging level. Possible values: "debug", "info", "warn", "error", "panic", "fatal".
#
# Default: "error"
log_level: error
================================================
FILE: .vscode/launch.json
================================================
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Start RR with AMQP",
"type": "go",
"request": "launch",
"mode": "auto",
"program": "${workspaceFolder}/cmd/rr/main.go",
"args": [
"serve",
"-c",
"../../.rr-sample-bench-jobs.yaml"
],
},
{
"name": "Start RR with HTTP",
"type": "go",
"request": "launch",
"mode": "auto",
"program": "${workspaceFolder}/cmd/rr/main.go",
"args": [
"serve",
"-c",
"../../.rr-sample-bench-http.yaml"
],
},
{
"name": "RR workers",
"type": "go",
"request": "launch",
"mode": "auto",
"program": "${workspaceFolder}/cmd/rr/main.go",
"args": [
"workers",
"-c",
"../../.rr-sample-bench-http.yaml"
],
},
]
}
================================================
FILE: CHANGELOG.md
================================================
# CHANGELOG
releases: [docs](https://docs.roadrunner.dev/docs/releases)
================================================
FILE: CLAUDE.md
================================================
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Project Overview
RoadRunner is a high-performance PHP application server and process manager written in Go. It supports running as a service with extensive plugin functionality for HTTP/2/3, gRPC, queues (RabbitMQ, Kafka, SQS, NATS), KV stores, WebSockets, Temporal workflows, and more.
## Development Commands
### Build
```bash
make build
# Or manually:
CGO_ENABLED=0 go build -trimpath -ldflags "-s" -o rr cmd/rr/main.go
```
### Test
```bash
make test
# Or manually:
go test -v -race ./...
```
### Debug
```bash
make debug
# Uses delve to debug with sample config
```
### Run RoadRunner
```bash
./rr serve -c .rr.yaml
```
### Other Commands
```bash
./rr workers # Show worker status
./rr workers -i # Interactive worker information
./rr reset # Reset workers
./rr jobs # Jobs management commands
./rr stop # Stop RoadRunner server
```
### Run Single Test
```bash
go test -v -race -run TestName ./path/to/package
```
## Architecture
### Plugin System
RoadRunner uses the **Endure** dependency injection container. All plugins are registered in `container/plugins.go:Plugins()`. The plugin architecture follows these principles:
1. **Plugin Registration**: Plugins are listed in `container/plugins.go` and automatically wired by Endure
2. **Plugin Dependencies**: Plugins declare dependencies via struct fields with interface types
3. **Initialization Order**: Endure resolves the dependency graph and initializes plugins in correct order
### Key Components
- **`cmd/rr/main.go`**: Entry point that delegates to CLI commands
- **`internal/cli/`**: CLI command implementations (serve, workers, reset, jobs, stop)
- **`container/`**: Plugin registration and Endure container configuration
- **Plugin packages**: External packages under `github.com/roadrunner-server/*` (imported in go.mod)
### Configuration
- Primary config: `.rr.yaml` (extensive sample provided)
- Version 3 config format required (`version: '3'`)
- Environment variable substitution supported: `${ENVIRONMENT_VARIABLE_NAME}`
- Sample configs: `.rr-sample-*.yaml` for different use cases (HTTP, gRPC, Temporal, Kafka, etc.)
### Core Plugins
**Server Management:**
- `server`: Worker pool management (NewWorker, NewWorkerPool)
- `rpc`: RPC server for PHP-to-Go communication (default: tcp://127.0.0.1:6001)
- `logger`: Logging infrastructure
- `informer`: Worker status reporting
- `resetter`: Worker reset functionality
**Protocol Servers:**
- `http`: HTTP/1/2/3 and FastCGI server with middleware support
- `grpc`: gRPC server
- `tcp`: Raw TCP connection handling
**Jobs/Queue Drivers:**
- `jobs`: Core jobs plugin
- `amqp`, `sqs`, `nats`, `kafka`, `beanstalk`: Queue backends
- `gps`: Google Pub/Sub
**KV Stores:**
- `kv`: Core KV plugin
- `memory`, `boltdb`, `redis`, `memcached`: Storage backends
**HTTP Middleware:**
- `static`, `headers`, `gzip`, `prometheus`, `send`, `proxy_ip_parser`, `otel`, `fileserver`
**Other:**
- `temporal`: Temporal.io workflow engine integration
- `centrifuge`: WebSocket/Broadcast via Centrifugo
- `lock`: Distributed locks
- `metrics`: Prometheus metrics
- `service`: Systemd-like service manager
### Worker Communication
RoadRunner communicates with PHP workers via:
- **Goridge protocol**: Binary protocol over pipes, TCP, or Unix sockets
- **RPC**: For management operations (reset, stats, etc.)
- Workers are PHP processes that implement the RoadRunner worker protocol
### Testing
- Tests use standard Go testing with `-race` flag
- Test files follow `*_test.go` convention
- Sample configs in `.rr-sample-*.yaml` are used for integration tests
- Test directories: `container/test`, `internal/rpc/test`
## Important Notes
- Go version: 1.25+ required (see go.mod)
- Module path: `github.com/roadrunner-server/roadrunner/v2025`
- Some versions are explicitly excluded in go.mod (e.g., go-redis v9.15.0, viper v1.18.x)
- Debug mode available via `--debug` flag (starts debug server on :6061)
- Config overrides supported via `-o dot.notation=value` flag
- Working directory can be set with `-w` flag
- `.env` file support via `--dotenv` flag or `DOTENV_PATH` environment variable
## Adding New Plugins
1. Import the plugin package in `container/plugins.go`
2. Add plugin instance to the `Plugins()` slice
3. Plugin must implement appropriate RoadRunner plugin interfaces
4. Endure will handle dependency injection and lifecycle management
## Configuration Patterns
- Each plugin has its own configuration section (named after plugin)
- Pools configuration is consistent across plugins (num_workers, max_jobs, timeouts, supervisor)
- TLS configuration follows similar pattern across plugins
- Most plugins support graceful shutdown via timeouts
================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at wolfy-j@spiralscout.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/
================================================
FILE: CONTRIBUTING.md
================================================
# Welcome to RoadRunner docs contributing guide <!-- omit in toc -->
Thank you for investing your time in contributing to our project! Any contribution you make will be reflected on [RR](https://github.com/roadrunner-server/roadrunner#contributors) :sparkles:.
Read our [Code of Conduct](./CODE_OF_CONDUCT.md) to keep our community approachable and respectable.
In this guide you will get an overview of the contribution workflow from opening an issue, creating a PR, reviewing, and merging the PR.
### Issues
#### Create a new issue
If you spot a problem with the RR, [search if an issue already exists](https://github.com/roadrunner-server/roadrunner/issues). If a related issue doesn't exist, you can open a new issue using a relevant [issue form](https://github.com/roadrunner-server/roadrunner/issues/new/choose).
#### Solve an issue
Scan through our [existing issues](https://github.com/roadrunner-server/roadrunner/issues) to find one that interests you. You can narrow down the search using `labels` as filters. If you find an issue to work on, you are welcome to open a PR with a fix.
### Pull Request
When you're finished with the changes, create a pull request, also known as a PR.
- Fill the "Ready for review" template so that we can review your PR. This template helps reviewers understand your changes as well as the purpose of your pull request.
- Don't forget to update the docs if you are solving one.
- Make sure, that all checkboxes in the PR template are solved.
Once you submit your PR, a RR team member will review your proposal. We may ask questions or request for additional information.
- As you update your PR and apply changes, mark each conversation as [resolved](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/commenting-on-a-pull-request#resolving-conversations).
- If you run into any merge issues, checkout this [git tutorial](https://github.com/skills/resolve-merge-conflicts) to help you resolve merge conflicts and other issues.
### Your PR is merged!
Congratulations :tada::tada: The RoadRunner team thanks you :sparkles:.
Once your PR is merged, your contributions will be publicly visible on the [RR page](https://github.com/roadrunner-server/roadrunner#contributors).
Now that you are part of the RoadRunner server community, see how else you can [contribute to the RR](https://github.com/roadrunner-server/roadrunner/issues).
================================================
FILE: Dockerfile
================================================
# Image page: <https://hub.docker.com/_/golang>
FROM --platform=${TARGETPLATFORM:-linux/amd64} golang:1.26-alpine AS builder
# app version and build date must be passed during image building (version without any prefix).
# e.g.: `docker build --build-arg "APP_VERSION=1.2.3" --build-arg "BUILD_TIME=$(date +%FT%T%z)" .`
ARG APP_VERSION="undefined"
ARG BUILD_TIME="undefined"
WORKDIR /src
# Copy module files first for layer caching
COPY go.mod go.sum ./
RUN go mod download
# Copy source and build
COPY . .
# arguments to pass on each go tool link invocation
ENV LDFLAGS="-s \
-X github.com/roadrunner-server/roadrunner/v2025/internal/meta.version=$APP_VERSION \
-X github.com/roadrunner-server/roadrunner/v2025/internal/meta.buildTime=$BUILD_TIME"
# compile and verify binary
RUN CGO_ENABLED=0 go build -trimpath -ldflags "$LDFLAGS" -o ./rr ./cmd/rr && ./rr -v
# ---- Final stage ----
FROM --platform=${TARGETPLATFORM:-linux/amd64} alpine:3
RUN apk upgrade --no-cache && apk add --no-cache ca-certificates
# use same build arguments for image labels
ARG APP_VERSION="undefined"
ARG BUILD_TIME="undefined"
# https://github.com/opencontainers/image-spec/blob/main/annotations.md
LABEL org.opencontainers.image.title="roadrunner"
LABEL org.opencontainers.image.description="High-performance PHP application server and process manager written in Go and powered with plugins"
LABEL org.opencontainers.image.url="https://roadrunner.dev"
LABEL org.opencontainers.image.source="https://github.com/roadrunner-server/roadrunner"
LABEL org.opencontainers.image.vendor="SpiralScout"
LABEL org.opencontainers.image.version="$APP_VERSION"
LABEL org.opencontainers.image.created="$BUILD_TIME"
LABEL org.opencontainers.image.licenses="MIT"
# Non-root user
RUN addgroup -S rr && adduser -S -G rr rr
# copy required files from builder image
COPY --from=builder /src/rr /usr/bin/rr
COPY --from=builder /src/.rr.yaml /etc/rr.yaml
USER rr
# use roadrunner binary as image entrypoint
ENTRYPOINT ["/usr/bin/rr"]
CMD ["serve", "-c", "/etc/rr.yaml"]
================================================
FILE: LICENSE
================================================
MIT License
Copyright (c) 2020 Spiral Scout
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: Makefile
================================================
test:
go test -v -race ./...
build:
CGO_ENABLED=0 go build -trimpath -ldflags "-s" -o rr cmd/rr/main.go
debug:
dlv debug cmd/rr/main.go -- serve -c .rr-sample-bench-http.yaml
================================================
FILE: README.md
================================================
<a href="https://roadrunner.dev" target="_blank">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://github.com/roadrunner-server/.github/assets/8040338/e6bde856-4ec6-4a52-bd5b-bfe78736c1ff">
<img align="center" src="https://github.com/roadrunner-server/.github/assets/8040338/040fb694-1dd3-4865-9d29-8e0748c2c8b8">
</picture>
</a>
<p align="center">
<a href="https://packagist.org/packages/spiral/roadrunner"><img src="https://poser.pugx.org/spiral/roadrunner/version"></a>
<a href="https://pkg.go.dev/github.com/roadrunner-server/roadrunner/v2025?tab=doc"><img src="https://godoc.org/github.com/roadrunner-server/roadrunner/v2025?status.svg"></a>
<a href="https://twitter.com/spiralphp"><img src="https://img.shields.io/twitter/follow/spiralphp?style=social"></a>
<a href="https://codecov.io/gh/roadrunner-server/roadrunner/"><img src="https://codecov.io/gh/roadrunner-server/roadrunner/branch/master/graph/badge.svg"></a>
<a href="https://github.com/roadrunner-server/roadrunner/actions"><img src="https://github.com/roadrunner-server/roadrunner/workflows/rr_cli_tests/badge.svg" alt=""></a>
<a href="https://goreportcard.com/report/github.com/roadrunner-server/roadrunner/v2"><img src="https://goreportcard.com/badge/github.com/roadrunner-server/roadrunner/v2"></a>
<a href="https://discord.gg/TFeEmCs"><img src="https://img.shields.io/badge/discord-chat-magenta.svg"></a>
<a href="https://packagist.org/packages/spiral/roadrunner"><img src="https://img.shields.io/packagist/dd/spiral/roadrunner?style=flat-square"></a>
<img alt="All releases" src="https://img.shields.io/github/downloads/roadrunner-server/roadrunner/total">
<a href="https://gurubase.io/g/roadrunner"><img src="https://img.shields.io/badge/Gurubase-Ask%20RoadRunner%20Guru-006BFF?style=flat-square"></a>
</p>
RoadRunner is an open-source (MIT licensed) high-performance PHP application server, process manager written in Go and powered with plugins ❤️.
It supports running as a service with the ability to extend its functionality on a per-project basis with plugins.
# Features
**RoadRunner** features a range of plugins, including `HTTP(S)/2/3` and `fCGI` servers that are compatible with PSR-7/PSR-17 standards. This is just one of its many capabilities. It serves as an effective alternative to the traditional Nginx+FPM setup, providing improved performance and more flexibility. Its extensive plugin options go far beyond just `HTTP(S)/2/3` and `fCGI` servers, offering a broad range of functionalities:
- Queue drivers: RabbitMQ, Kafka, SQS, Beanstalk, NATS, In-Memory.
- KV drivers: Redis, Memcached, BoltDB, In-Memory.
- OpenTelemetry protocol support (`gRPC`, `http`, `jaeger`).
- [Workflow engine](https://github.com/temporalio/sdk-php) via [Temporal](https://temporal.io).
- `gRPC` server. For increased speed, the `protobuf` extension can be used.
- `HTTP(S)/2/3` and `fCGI` servers features **automatic TLS management**, **103 Early Hints** support and middleware like: Static, Headers, gzip, prometheus (metrics), send (x-sendfile), OTEL, proxy_ip_parser, etc.
- Embedded distribute lock plugin which manages access to shared resources.
- Metrics server (you might easily expose your own).
- WebSockets and Broadcast via [Centrifugo](https://centrifugal.dev) server.
- Systemd-like services manager with auto-restarts, execution time limiter, etc.
- Production-ready.
- And more 😉
# Join our discord server: [Link](https://discord.gg/TFeEmCs)
<p align="center">
<a href="https://roadrunner.dev/"><b>Official Website</b></a> |
<a href="https://docs.roadrunner.dev/"><b>Documentation</b></a> |
<a href="https://github.com/orgs/roadrunner-server/discussions"><b>Forum</b></a> |
<a href="https://github.com/orgs/roadrunner-server/projects/4"><b>Release schedule</b></a> |
<a href="https://gurubase.io/g/roadrunner"><b>Ask RoadRunner Guru</b></a>
</p>
# Installation
The easiest way to get the latest RoadRunner version is to use one of the pre-built release binaries, which are available for
OSX, Linux, FreeBSD, and Windows. Instructions for using these binaries are on the GitHub [releases page](https://github.com/roadrunner-server/roadrunner/releases).
## Docker:
To get the roadrunner binary file you can use our docker image: `ghcr.io/roadrunner-server/roadrunner:2025.X.X` (more information about
image and tags can be found [here](https://github.com/roadrunner-server/roadrunner/pkgs/container/roadrunner)).
```dockerfile
FROM ghcr.io/roadrunner-server/roadrunner:2025.X.X AS roadrunner
FROM php:8.3-cli
COPY --from=roadrunner /usr/bin/rr /usr/local/bin/rr
# USE THE RR
```
Configuration located in the `.rr.yaml` file ([full sample](https://github.com/roadrunner-server/roadrunner/blob/master/.rr.yaml)):
## Installation via Composer
You can also install RoadRunner automatically using the command shipped with the composer package, run:
```bash
composer require spiral/roadrunner-cli
./vendor/bin/rr get-binary
```
Server binary will be available at the root of your project.
> **Note**
>
> PHP's extensions `php-curl` and `php-zip` are required to download RoadRunner automatically.
> PHP's extensions `php-sockets` need to be installed to run roadrunner.
> Check with `php --modules` your installed extensions.
## Installation option for the Debian-derivatives (Ubuntu, Mint, MX, etc)
```bash
wget https://github.com/roadrunner-server/roadrunner/releases/download/v2025.X.X/roadrunner-2025.X.X-linux-amd64.deb
sudo dpkg -i roadrunner-2025.X.X-linux-amd64.deb
```
## Download the latest release via curl:
```bash
curl --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/roadrunner-server/roadrunner/master/download-latest.sh | sh
```
## MacOS using [Homebrew](https://brew.sh/):
```bash
brew install roadrunner
```
## Windows using [Chocolatey](https://community.chocolatey.org/):
```bash
choco install roadrunner
```
---
Configuration can be located in `.rr.yaml` file ([full sample](https://github.com/roadrunner-server/roadrunner/blob/master/.rr.yaml)):
```yaml
version: '3'
rpc:
listen: tcp://127.0.0.1:6001
server:
command: "php worker.php"
http:
address: "0.0.0.0:8080"
logs:
level: error
```
> Read more in [Documentation](https://docs.roadrunner.dev).
Example Worker:
--------
```php
<?php
use Spiral\RoadRunner;
use Nyholm\Psr7;
include "vendor/autoload.php";
$worker = RoadRunner\Worker::create();
$psrFactory = new Psr7\Factory\Psr17Factory();
$worker = new RoadRunner\Http\PSR7Worker($worker, $psrFactory, $psrFactory, $psrFactory);
while ($req = $worker->waitRequest()) {
try {
$rsp = new Psr7\Response();
$rsp->getBody()->write('Hello world!');
$worker->respond($rsp);
} catch (\Throwable $e) {
$worker->getWorker()->error((string)$e);
}
}
```
> [!IMPORTANT]
> If you see the `EOF` error, check that you have installed the PHP packages from [this step](https://github.com/roadrunner-server/roadrunner#installation-via-composer).
> If this does not help, try to execute the command `php worker.php` directly and check the output.
---
### Available Plugins: [link](https://docs.roadrunner.dev)
Run:
----
To run application server:
```
$ ./rr serve -c .rr.yaml
```
License:
--------
The MIT License (MIT). Please see [`LICENSE`](./LICENSE) for more information. Maintained
by [Spiral Scout](https://spiralscout.com).
## Contributors
Thanks to all the people who already contributed!
<a href="https://github.com/roadrunner-server/roadrunner/graphs/contributors">
<img src="https://contributors-img.web.app/image?repo=roadrunner-server/roadrunner" />
</a>
================================================
FILE: SECURITY.md
================================================
# Security Policy
## Supported Versions
| Version | Supported |
|----------|-----------|
| 2.x | No |
| 2023.x.x | No |
| 2024.x.x | Yes |
| 2025.x.x | Yes |
================================================
FILE: benchmarks/simple.js
================================================
import http from 'k6/http';
import { sleep } from 'k6';
export const options = {
// A number specifying the number of VUs to run concurrently.
vus: 1000,
// A string specifying the total duration of the test run.
duration: '30s',
// The following section contains configuration options for execution of this
// test script in Grafana Cloud.
//
// See https://grafana.com/docs/grafana-cloud/k6/get-started/run-cloud-tests-from-the-cli/
// to learn about authoring and running k6 test scripts in Grafana k6 Cloud.
//
// ext: {
// loadimpact: {
// // The ID of the project to which the test is assigned in the k6 Cloud UI.
// // By default tests are executed in default project.
// projectID: "",
// // The name of the test in the k6 Cloud UI.
// // Test runs with the same name will be grouped.
// name: "script.js"
// }
// },
// Uncomment this section to enable the use of Browser API in your tests.
//
// See https://grafana.com/docs/k6/latest/using-k6-browser/running-browser-tests/ to learn more
// about using Browser API in your test scripts.
//
// scenarios: {
// // The scenario name appears in the result summary, tags, and so on.
// // You can give the scenario any name, as long as each name in the script is unique.
// ui: {
// // Executor is a mandatory parameter for browser-based tests.
// // Shared iterations in this case tells k6 to reuse VUs to execute iterations.
// //
// // See https://grafana.com/docs/k6/latest/using-k6/scenarios/executors/ for other executor types.
// executor: 'shared-iterations',
// options: {
// browser: {
// // This is a mandatory parameter that instructs k6 to launch and
// // connect to a chromium-based browser, and use it to run UI-based
// // tests.
// type: 'chromium',
// },
// },
// },
// }
};
// The function that defines VU logic.
//
// See https://grafana.com/docs/k6/latest/examples/get-started-with-k6/ to learn more
// about authoring k6 scripts.
//
let params = {
timeout: '120s'
};
export default function() {
http.get('http://127.0.0.1:15389', params);
}
================================================
FILE: cmd/rr/command_test.go
================================================
package main
import (
"bytes"
"io"
"os"
"testing"
"time"
"github.com/stretchr/testify/assert"
)
func Test_Main(t *testing.T) {
os.Args = []string{"rr", "--help"}
exitFn = func(code int) { assert.Equal(t, 0, code) }
r, w, _ := os.Pipe()
os.Stdout = w
main()
_ = w.Close()
buf := new(bytes.Buffer)
_ = r.SetReadDeadline(time.Now().Add(time.Second))
_, _ = io.Copy(buf, r)
assert.Contains(t, buf.String(), "Usage:")
assert.Contains(t, buf.String(), "Available Commands:")
assert.Contains(t, buf.String(), "Flags:")
}
func Test_MainWithoutCommands(t *testing.T) {
os.Args = []string{"rr"}
exitFn = func(code int) { assert.Equal(t, 0, code) }
r, w, _ := os.Pipe()
os.Stdout = w
main()
buf := new(bytes.Buffer)
_ = r.SetReadDeadline(time.Now().Add(time.Second))
_, _ = io.Copy(buf, r)
assert.Contains(t, buf.String(), "Usage:")
assert.Contains(t, buf.String(), "Available Commands:")
assert.Contains(t, buf.String(), "Flags:")
}
func Test_MainUnknownSubcommand(t *testing.T) {
os.Args = []string{"", "foobar"}
exitFn = func(code int) { assert.Equal(t, 1, code) }
r, w, _ := os.Pipe()
os.Stderr = w
main()
_ = w.Close()
buf := new(bytes.Buffer)
_ = r.SetReadDeadline(time.Now().Add(time.Second))
_, _ = io.Copy(buf, r)
assert.Contains(t, buf.String(), "unknown command")
assert.Contains(t, buf.String(), "foobar")
}
================================================
FILE: cmd/rr/doc.go
================================================
// Package main is the entry point for the RoadRunner CLI application.
package main
================================================
FILE: cmd/rr/main.go
================================================
package main
import (
"os"
"path/filepath"
"github.com/fatih/color"
"github.com/roadrunner-server/roadrunner/v2025/internal/cli"
)
// exitFn is a function for an application exiting.
var exitFn = os.Exit //nolint:gochecknoglobals
// main CLI application entrypoint.
func main() { exitFn(run()) }
// run this CLI application.
func run() int {
cmd := cli.NewCommand(filepath.Base(os.Args[0]))
if err := cmd.Execute(); err != nil {
_, _ = color.New(color.FgHiRed, color.Bold).Fprintln(os.Stderr, err.Error())
return 1
}
return 0
}
================================================
FILE: codecov.yml
================================================
coverage:
status:
project:
default:
target: auto
threshold: 0%
informational: true
patch:
default:
target: auto
threshold: 0%
informational: true
================================================
FILE: composer.json
================================================
{
"name": "spiral/roadrunner",
"type": "metapackage",
"description": "RoadRunner: High-performance PHP application server and process manager written in Go and powered with plugins",
"license": "MIT",
"homepage": "https://roadrunner.dev/",
"support": {
"docs": "https://docs.roadrunner.dev/",
"issues": "https://github.com/roadrunner-server/roadrunner/issues",
"chat": "https://discord.gg/V6EK4he"
},
"authors": [
{
"name": "Anton Titov / Wolfy-J",
"email": "wolfy.jd@gmail.com"
},
{
"name": "Valery Piashchynski",
"homepage": "https://github.com/rustatian"
},
{
"name": "RoadRunner Community",
"homepage": "https://github.com/roadrunner-server/roadrunner/graphs/contributors"
}
],
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/roadrunner-server"
}
]
}
================================================
FILE: container/config.go
================================================
package container
import (
"fmt"
"log/slog"
"time"
"github.com/spf13/viper"
)
// Config defines endure container configuration.
type Config struct {
GracePeriod time.Duration `mapstructure:"grace_period"`
LogLevel string `mapstructure:"log_level"`
WatchdogSec int `mapstructure:"watchdog_sec"`
PrintGraph bool `mapstructure:"print_graph"`
}
const (
// endure config key
endureKey = "endure"
// overall grace period, after which container will be stopped forcefully
defaultGracePeriod = time.Second * 30
)
// NewConfig creates endure container configuration.
func NewConfig(cfgFile string) (*Config, error) {
v := viper.New()
v.SetConfigFile(cfgFile)
err := v.ReadInConfig()
if err != nil {
return nil, err
}
cfg := &Config{
GracePeriod: defaultGracePeriod,
LogLevel: "error",
PrintGraph: false,
}
if !v.IsSet(endureKey) {
return cfg, nil
}
err = v.UnmarshalKey(endureKey, cfg)
if err != nil {
return nil, err
}
return cfg, nil
}
func ParseLogLevel(s string) (slog.Leveler, error) {
switch s {
case "debug":
return slog.LevelDebug, nil
case "info":
return slog.LevelInfo, nil
case "warn", "warning":
return slog.LevelWarn, nil
case "error":
return slog.LevelError, nil
default:
return slog.LevelError, fmt.Errorf(`unknown log level "%s" (allowed: debug, info, warn, error)`, s)
}
}
================================================
FILE: container/config_test.go
================================================
package container_test
import (
"log/slog"
"testing"
"time"
"github.com/roadrunner-server/config/v5"
"github.com/roadrunner-server/roadrunner/v2025/container"
"github.com/stretchr/testify/assert"
)
func TestNewConfig_SuccessfulReading(t *testing.T) {
c, err := container.NewConfig("test/endure_ok.yaml")
assert.NoError(t, err)
assert.NotNil(t, c)
ll, err := container.ParseLogLevel(c.LogLevel)
assert.NoError(t, err)
assert.Equal(t, time.Second*10, c.GracePeriod)
assert.True(t, c.PrintGraph)
assert.Equal(t, slog.LevelWarn, ll.Level())
}
func TestNewConfig_WithoutEndureKey(t *testing.T) {
cfgPlugin := &config.Plugin{Type: "yaml", ReadInCfg: []byte{}}
assert.NoError(t, cfgPlugin.Init())
c, err := container.NewConfig("test/without_endure_ok.yaml")
assert.NoError(t, err)
assert.NotNil(t, c)
ll, err := container.ParseLogLevel(c.LogLevel)
assert.NoError(t, err)
assert.Equal(t, time.Second*30, c.GracePeriod)
assert.False(t, c.PrintGraph)
assert.Equal(t, slog.LevelError, ll.Level())
}
func TestNewConfig_LoggingLevels(t *testing.T) {
for _, tt := range []struct {
path string
giveLevel string
wantLevel slog.Leveler
wantError bool
}{
{path: "test/endure_ok_debug.yaml", giveLevel: "debug", wantLevel: slog.LevelDebug},
{path: "test/endure_ok_info.yaml", giveLevel: "info", wantLevel: slog.LevelInfo},
{path: "test/endure_ok_warn.yaml", giveLevel: "warn", wantLevel: slog.LevelWarn},
{path: "test/endure_ok_error.yaml", giveLevel: "error", wantLevel: slog.LevelError},
{path: "test/endure_ok_foobar.yaml", giveLevel: "foobar", wantError: true},
} {
t.Run(tt.giveLevel, func(t *testing.T) {
cfgPlugin := &config.Plugin{Type: "yaml", ReadInCfg: []byte("endure:\n log_level: " + tt.giveLevel)}
assert.NoError(t, cfgPlugin.Init())
c, err := container.NewConfig(tt.path)
assert.NotNil(t, c)
ll, err2 := container.ParseLogLevel(c.LogLevel)
if tt.wantError {
assert.Error(t, err2)
assert.Contains(t, err2.Error(), "unknown log level")
} else {
assert.NoError(t, err)
assert.NoError(t, err2)
assert.Equal(t, tt.wantLevel, ll.Level())
}
})
}
}
================================================
FILE: container/container_test.go
================================================
package container_test
import (
"log/slog"
"testing"
"time"
"github.com/roadrunner-server/endure/v2"
"github.com/stretchr/testify/assert"
)
func TestNewContainer(t *testing.T) { // there is no legal way to test container options
c := endure.New(slog.LevelDebug, endure.Visualize(), endure.GracefulShutdownTimeout(time.Second))
c2 := endure.New(slog.LevelDebug, endure.Visualize(), endure.GracefulShutdownTimeout(time.Second))
assert.NotNil(t, c)
assert.NotNil(t, c2)
}
================================================
FILE: container/doc.go
================================================
// Package container provides Endure dependency injection container configuration
// and plugin registration for the RoadRunner application server.
package container
================================================
FILE: container/plugins.go
================================================
package container
import (
"github.com/roadrunner-server/amqp/v5"
appLogger "github.com/roadrunner-server/app-logger/v5"
"github.com/roadrunner-server/beanstalk/v5"
"github.com/roadrunner-server/boltdb/v5"
"github.com/roadrunner-server/centrifuge/v5"
"github.com/roadrunner-server/fileserver/v5"
gps "github.com/roadrunner-server/google-pub-sub/v5"
grpcPlugin "github.com/roadrunner-server/grpc/v5"
"github.com/roadrunner-server/gzip/v5"
"github.com/roadrunner-server/headers/v5"
httpPlugin "github.com/roadrunner-server/http/v5"
"github.com/roadrunner-server/informer/v5"
"github.com/roadrunner-server/jobs/v5"
"github.com/roadrunner-server/kafka/v5"
"github.com/roadrunner-server/kv/v5"
"github.com/roadrunner-server/lock/v5"
"github.com/roadrunner-server/logger/v5"
"github.com/roadrunner-server/memcached/v5"
"github.com/roadrunner-server/memory/v5"
"github.com/roadrunner-server/metrics/v5"
"github.com/roadrunner-server/nats/v5"
rrOtel "github.com/roadrunner-server/otel/v5"
"github.com/roadrunner-server/prometheus/v5"
proxyIP "github.com/roadrunner-server/proxy_ip_parser/v5"
"github.com/roadrunner-server/redis/v5"
"github.com/roadrunner-server/resetter/v5"
rpcPlugin "github.com/roadrunner-server/rpc/v5"
"github.com/roadrunner-server/send/v5"
"github.com/roadrunner-server/server/v5"
"github.com/roadrunner-server/service/v5"
"github.com/roadrunner-server/sqs/v5"
"github.com/roadrunner-server/static/v5"
"github.com/roadrunner-server/status/v5"
"github.com/roadrunner-server/tcp/v5"
rrt "github.com/temporalio/roadrunner-temporal/v5"
)
// Plugins return active plugins for the endured container. Feel free to add or remove any plugins.
func Plugins() []any { //nolint:funlen
return []any{
// bundled
// informer plugin (./rr workers, ./rr workers -i)
&informer.Plugin{},
// resetter plugin (./rr reset)
&resetter.Plugin{},
// mutexes(locks)
&lock.Plugin{},
// logger plugin
&logger.Plugin{},
// psr-3 logger extension
&appLogger.Plugin{},
// metrics plugin
&metrics.Plugin{},
// rpc plugin (workers, reset)
&rpcPlugin.Plugin{},
// server plugin (NewWorker, NewWorkerPool)
&server.Plugin{},
// service plugin
&service.Plugin{},
// centrifuge
¢rifuge.Plugin{},
//
// ========= JOBS bundle
&jobs.Plugin{},
&amqp.Plugin{},
&sqs.Plugin{},
&nats.Plugin{},
&kafka.Plugin{},
&beanstalk.Plugin{},
&gps.Plugin{},
// =========
//
// http server plugin with middleware
&httpPlugin.Plugin{},
&static.Plugin{},
&headers.Plugin{},
&status.Plugin{},
&gzip.Plugin{},
&prometheus.Plugin{},
&send.Plugin{},
&proxyIP.Plugin{},
&rrOtel.Plugin{},
&fileserver.Plugin{},
// ===================
// gRPC
&grpcPlugin.Plugin{},
// ===================
// KV + Jobs
&memory.Plugin{},
// KV + Jobs
&boltdb.Plugin{},
// ============== KV
&kv.Plugin{},
&memcached.Plugin{},
&redis.Plugin{},
// ==============
// raw TCP connections handling
&tcp.Plugin{},
// temporal plugin
&rrt.Plugin{},
}
}
================================================
FILE: container/plugins_test.go
================================================
package container
import (
"reflect"
"testing"
)
func TestPlugins(t *testing.T) {
for _, p := range Plugins() {
if p == nil {
t.Error("plugin cannot be nil")
}
if pk := reflect.TypeOf(p).Kind(); pk != reflect.Ptr && pk != reflect.Struct {
t.Errorf("plugin %v must be a structure or pointer to the structure", p)
}
}
}
================================================
FILE: container/test/endure_ok.yaml
================================================
endure:
grace_period: 10s
print_graph: true
retry_on_fail: true
log_level: warn
================================================
FILE: container/test/endure_ok_debug.yaml
================================================
endure:
grace_period: 10s
print_graph: true
retry_on_fail: true
log_level: debug
================================================
FILE: container/test/endure_ok_error.yaml
================================================
endure:
grace_period: 10s
print_graph: true
retry_on_fail: true
log_level: error
================================================
FILE: container/test/endure_ok_foobar.yaml
================================================
endure:
grace_period: 10s
print_graph: true
retry_on_fail: true
log_level: foobar
================================================
FILE: container/test/endure_ok_info.yaml
================================================
endure:
grace_period: 10s
print_graph: true
retry_on_fail: true
log_level: info
================================================
FILE: container/test/endure_ok_warn.yaml
================================================
endure:
grace_period: 10s
print_graph: true
retry_on_fail: true
log_level: warn
================================================
FILE: container/test/without_endure_ok.yaml
================================================
================================================
FILE: download-latest.sh
================================================
#!/bin/sh
# This script can optionally use a GitHub token to increase your request limit (for example, if using this script in a CI).
# To use a GitHub token, pass it through the GITHUB_PAT environment variable.
# GLOBALS
# Colors
RED='\033[31m'
GREEN='\033[32m'
DEFAULT='\033[0m'
# Project name
PNAME='roadrunner'
# GitHub API address
GITHUB_API='https://api.github.com/repos/roadrunner-server/roadrunner/releases'
# GitHub Release address
GITHUB_REL='https://github.com/roadrunner-server/roadrunner/releases/download'
# FUNCTIONS
# Gets the version of the latest stable version of RoadRunner by setting the $latest variable.
# Returns 0 in case of success, 1 otherwise.
get_latest() {
# temp_file is needed because the grep would start before the download is over
temp_file=$(mktemp -q /tmp/$PNAME.XXXXXXXXX)
latest_release="$GITHUB_API/latest"
if ! temp_file=$(mktemp -q /tmp/$PNAME.XXXXXXXXX); then
echo "$0: Can't create temp file."
fetch_release_failure_usage
exit 1
fi
if [ -z "$GITHUB_PAT" ]; then
curl -s "$latest_release" >"$temp_file" || return 1
else
curl -H "Authorization: token $GITHUB_PAT" -s "$latest_release" >"$temp_file" || return 1
fi
latest="$(grep <"$temp_file" '"tag_name":' | cut -d ':' -f2 | tr -d '"' | tr -d ',' | tr -d ' ' | tr -d 'v')"
latestV="$(grep <"$temp_file" '"tag_name":' | cut -d ':' -f2 | tr -d '"' | tr -d ',' | tr -d ' ')"
rm -f "$temp_file"
return 0
}
# 0 -> not alpine
# 1 -> alpine
isAlpine() {
# shellcheck disable=SC2143
if [ "$(grep <"/etc/os-release" "NAME=" | grep -ic "Alpine")" ]; then
return 1
fi
return 0
}
# Gets the OS by setting the $os variable.
# Returns 0 in case of success, 1 otherwise.
get_os() {
os_name=$(uname -s)
case "$os_name" in
# ---
'Darwin')
os='darwin'
;;
# ---
'Linux')
os='linux'
if isAlpine; then
os="unknown-musl"
fi
;;
# ---
'MINGW'*)
os='windows'
;;
# ---
*)
return 1
;;
esac
return 0
}
# Gets the architecture by setting the $arch variable.
# Returns 0 in case of success, 1 otherwise.
get_arch() {
architecture=$(uname -m)
# case 1
case "$architecture" in
'x86_64' | 'amd64')
arch='amd64'
;;
# case 2
'arm64' | 'aarch64')
arch='arm64'
;;
# all other
*)
return 1
;;
esac
return 0
}
get_compress() {
os_name=$(uname -s)
case "$os_name" in
'Darwin')
compress='tar.gz'
;;
'Linux')
compress='tar.gz'
if isAlpine; then
compress="zip"
fi
;;
'MINGW'*)
compress='zip'
;;
*)
return 1
;;
esac
return 0
}
not_available_failure_usage() {
printf "$RED%s\n$DEFAULT" 'ERROR: RoadRunner binary is not available for your OS distribution or your architecture yet.'
echo ''
echo 'However, you can easily compile the binary from the source files.'
echo 'Follow the steps at the page ("Source" tab): TODO'
}
fetch_release_failure_usage() {
echo ''
printf "$RED%s\n$DEFAULT" 'ERROR: Impossible to get the latest stable version of RoadRunner.'
echo 'Please let us know about this issue: https://github.com/roadrunner-server/roadrunner/issues/new/choose'
echo ''
echo 'In the meantime, you can manually download the appropriate binary from the GitHub release assets here: https://github.com/roadrunner-server/roadrunner/releases/latest'
}
fill_release_variables() {
# Fill $latest variable.
if ! get_latest; then
fetch_release_failure_usage
exit 1
fi
if [ "$latest" = '' ]; then
fetch_release_failure_usage
exit 1
fi
# Fill $os variable.
if ! get_os; then
not_available_failure_usage
exit 1
fi
# Fill $arch variable.
if ! get_arch; then
not_available_failure_usage
exit 1
fi
# Fill $compress variable
if ! get_compress; then
not_available_failure_usage
exit 1
fi
}
download_binary() {
fill_release_variables
echo "Downloading RoadRunner binary $latest for $os, architecture $arch..."
release_file="$PNAME-$latest-$os-$arch.$compress"
if ! curl --fail -OL "$GITHUB_REL/$latestV/$release_file"; then
fetch_release_failure_usage
exit 1
fi
printf "$GREEN%s\n$DEFAULT" "RoadRunner $latest archive successfully downloaded as $release_file"
}
download_binary
================================================
FILE: githooks-installer.sh
================================================
#!/bin/sh
set -e
cp ./.githooks/pre-commit .git/hooks/pre-commit
echo "DONE"
================================================
FILE: go.mod
================================================
module github.com/roadrunner-server/roadrunner/v2025
go 1.26.1
require (
github.com/buger/goterm v1.0.4
github.com/dustin/go-humanize v1.0.1
github.com/fatih/color v1.18.0
github.com/joho/godotenv v1.5.1
github.com/olekukonko/tablewriter v1.1.4
github.com/roadrunner-server/amqp/v5 v5.2.3
github.com/roadrunner-server/api/v4 v4.23.0
github.com/roadrunner-server/app-logger/v5 v5.1.9
github.com/roadrunner-server/beanstalk/v5 v5.1.9
github.com/roadrunner-server/boltdb/v5 v5.1.9
github.com/roadrunner-server/centrifuge/v5 v5.1.9
github.com/roadrunner-server/config/v5 v5.1.9
github.com/roadrunner-server/endure/v2 v2.6.2
github.com/roadrunner-server/errors v1.4.1
github.com/roadrunner-server/fileserver/v5 v5.1.9
github.com/roadrunner-server/google-pub-sub/v5 v5.1.9
github.com/roadrunner-server/goridge/v3 v3.8.3
github.com/roadrunner-server/grpc/v5 v5.3.0
github.com/roadrunner-server/gzip/v5 v5.3.0
github.com/roadrunner-server/headers/v5 v5.2.0
github.com/roadrunner-server/http/v5 v5.3.0
github.com/roadrunner-server/informer/v5 v5.1.9
github.com/roadrunner-server/jobs/v5 v5.1.9
github.com/roadrunner-server/kafka/v5 v5.2.5
github.com/roadrunner-server/kv/v5 v5.2.9
github.com/roadrunner-server/lock/v5 v5.1.9
github.com/roadrunner-server/logger/v5 v5.1.9
github.com/roadrunner-server/memcached/v5 v5.1.9
github.com/roadrunner-server/memory/v5 v5.2.9
github.com/roadrunner-server/metrics/v5 v5.2.0
github.com/roadrunner-server/nats/v5 v5.1.9
github.com/roadrunner-server/otel/v5 v5.5.0
github.com/roadrunner-server/pool v1.1.3
github.com/roadrunner-server/prometheus/v5 v5.2.0
github.com/roadrunner-server/proxy_ip_parser/v5 v5.1.9
github.com/roadrunner-server/redis/v5 v5.1.10
github.com/roadrunner-server/resetter/v5 v5.1.9
github.com/roadrunner-server/rpc/v5 v5.1.9
github.com/roadrunner-server/send/v5 v5.2.0
github.com/roadrunner-server/server/v5 v5.2.10
github.com/roadrunner-server/service/v5 v5.1.9
github.com/roadrunner-server/sqs/v5 v5.1.9
github.com/roadrunner-server/static/v5 v5.2.0
github.com/roadrunner-server/status/v5 v5.1.9
github.com/roadrunner-server/tcp/v5 v5.1.9
github.com/spf13/cobra v1.10.2
github.com/spf13/viper v1.21.0
github.com/stretchr/testify v1.11.1
github.com/temporalio/roadrunner-temporal/v5 v5.10.0
)
exclude (
github.com/olekukonko/tablewriter v1.1.1
github.com/redis/go-redis/v9 v9.15.0
github.com/redis/go-redis/v9 v9.15.1
github.com/spf13/viper v1.18.0
github.com/spf13/viper v1.18.1
go.temporal.io/api v1.26.1
)
require (
cloud.google.com/go v0.123.0 // indirect
cloud.google.com/go/auth v0.18.2 // indirect
cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect
cloud.google.com/go/compute/metadata v0.9.0 // indirect
cloud.google.com/go/iam v1.5.3 // indirect
cloud.google.com/go/pubsub/v2 v2.4.0 // indirect
github.com/andybalholm/brotli v1.2.0 // indirect
github.com/aws/aws-sdk-go-v2 v1.41.4 // indirect
github.com/aws/aws-sdk-go-v2/config v1.32.12 // indirect
github.com/aws/aws-sdk-go-v2/credentials v1.19.12 // indirect
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20 // indirect
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20 // indirect
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20 // indirect
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20 // indirect
github.com/aws/aws-sdk-go-v2/service/signin v1.0.8 // indirect
github.com/aws/aws-sdk-go-v2/service/sqs v1.42.24 // indirect
github.com/aws/aws-sdk-go-v2/service/sso v1.30.13 // indirect
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17 // indirect
github.com/aws/aws-sdk-go-v2/service/sts v1.41.9 // indirect
github.com/aws/smithy-go v1.24.2 // indirect
github.com/beanstalkd/go-beanstalk v0.2.0 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/bmatcuk/doublestar/v4 v4.10.0 // indirect
github.com/bradfitz/gomemcache v0.0.0-20250403215159-8d39553ac7cf // indirect
github.com/cactus/go-statsd-client/v5 v5.1.0 // indirect
github.com/caddyserver/certmagic v0.25.2 // indirect
github.com/caddyserver/zerossl v0.1.5 // indirect
github.com/cenkalti/backoff/v4 v4.3.0 // indirect
github.com/cenkalti/backoff/v5 v5.0.3 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/clipperhouse/displaywidth v0.11.0 // indirect
github.com/clipperhouse/uax29/v2 v2.7.0 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
github.com/emicklei/proto v1.14.3 // indirect
github.com/facebookgo/clock v0.0.0-20150410010913-600d898af40a // indirect
github.com/felixge/httpsnoop v1.0.4 // indirect
github.com/fsnotify/fsnotify v1.9.0 // indirect
github.com/go-logr/logr v1.4.3 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-ole/go-ole v1.3.0 // indirect
github.com/go-viper/mapstructure/v2 v2.5.0 // indirect
github.com/goccy/go-json v0.10.6 // indirect
github.com/gofiber/fiber/v2 v2.52.12 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/mock v1.7.0-rc.1 // indirect
github.com/google/s2a-go v0.1.9 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/googleapis/enterprise-certificate-proxy v0.3.14 // indirect
github.com/googleapis/gax-go/v2 v2.18.0 // indirect
github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.3 // indirect
github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/klauspost/compress v1.18.4 // indirect
github.com/klauspost/cpuid/v2 v2.3.0 // indirect
github.com/libdns/libdns v1.1.1 // indirect
github.com/mattn/go-colorable v0.1.14 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mattn/go-runewidth v0.0.21 // indirect
github.com/mholt/acmez v1.2.0 // indirect
github.com/mholt/acmez/v3 v3.1.6 // indirect
github.com/miekg/dns v1.1.72 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/nats-io/nats.go v1.49.0 // indirect
github.com/nats-io/nkeys v0.4.15 // indirect
github.com/nats-io/nuid v1.0.1 // indirect
github.com/nexus-rpc/sdk-go v0.6.0 // indirect
github.com/olekukonko/cat v0.0.0-20250911104152-50322a0618f6 // indirect
github.com/olekukonko/errors v1.2.0 // indirect
github.com/olekukonko/ll v0.1.7 // indirect
github.com/openzipkin/zipkin-go v0.4.3 // indirect
github.com/pelletier/go-toml/v2 v2.2.4 // indirect
github.com/pierrec/lz4/v4 v4.1.26 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/prometheus/client_golang v1.23.2 // indirect
github.com/prometheus/client_model v0.6.2 // indirect
github.com/prometheus/common v0.67.5 // indirect
github.com/prometheus/procfs v0.20.1 // indirect
github.com/quic-go/qpack v0.6.0 // indirect
github.com/quic-go/quic-go v0.59.0 // indirect
github.com/rabbitmq/amqp091-go v1.10.0 // indirect
github.com/redis/go-redis/extra/rediscmd/v9 v9.18.0 // indirect
github.com/redis/go-redis/extra/redisotel/v9 v9.18.0 // indirect
github.com/redis/go-redis/extra/redisprometheus/v9 v9.18.0 // indirect
github.com/redis/go-redis/v9 v9.18.0 // indirect
github.com/roadrunner-server/context v1.3.0 // indirect
github.com/roadrunner-server/events v1.0.1 // indirect
github.com/roadrunner-server/priority_queue v1.0.6 // indirect
github.com/roadrunner-server/tcplisten v1.5.2 // indirect
github.com/robfig/cron v1.2.0 // indirect
github.com/rs/cors v1.11.1 // indirect
github.com/sagikazarmark/locafero v0.12.0 // indirect
github.com/shirou/gopsutil v3.21.11+incompatible // indirect
github.com/spf13/afero v1.15.0 // indirect
github.com/spf13/cast v1.10.0 // indirect
github.com/spf13/pflag v1.0.10 // indirect
github.com/stretchr/objx v0.5.3 // indirect
github.com/subosito/gotenv v1.6.0 // indirect
github.com/tklauser/go-sysconf v0.3.16 // indirect
github.com/tklauser/numcpus v0.11.0 // indirect
github.com/twmb/franz-go v1.20.7 // indirect
github.com/twmb/franz-go/pkg/kmsg v1.12.0 // indirect
github.com/twmb/murmur3 v1.1.8 // indirect
github.com/uber-go/tally/v4 v4.1.17 // indirect
github.com/valyala/bytebufferpool v1.0.0 // indirect
github.com/valyala/fasthttp v1.69.0 // indirect
github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect
github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect
github.com/yusufpapurcu/wmi v1.2.4 // indirect
github.com/zeebo/assert v1.3.1 // indirect
github.com/zeebo/blake3 v0.2.4 // indirect
go.etcd.io/bbolt v1.4.3 // indirect
go.opencensus.io v0.24.0 // indirect
go.opentelemetry.io/auto/sdk v1.2.1 // indirect
go.opentelemetry.io/contrib/instrumentation/github.com/bradfitz/gomemcache/memcache/otelmemcache v0.43.0 // indirect
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.67.0 // indirect
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.67.0 // indirect
go.opentelemetry.io/contrib/propagators/jaeger v1.42.0 // indirect
go.opentelemetry.io/otel v1.42.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.42.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.42.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.42.0 // indirect
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.42.0 // indirect
go.opentelemetry.io/otel/exporters/zipkin v1.42.0 // indirect
go.opentelemetry.io/otel/metric v1.42.0 // indirect
go.opentelemetry.io/otel/sdk v1.42.0 // indirect
go.opentelemetry.io/otel/trace v1.42.0 // indirect
go.opentelemetry.io/proto/otlp v1.10.0 // indirect
go.temporal.io/api v1.62.4 // indirect
go.temporal.io/sdk v1.41.0 // indirect
go.temporal.io/sdk/contrib/opentelemetry v0.7.0 // indirect
go.temporal.io/sdk/contrib/tally v0.2.0 // indirect
go.temporal.io/server v1.30.1 // indirect
go.uber.org/atomic v1.11.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.27.1 // indirect
go.uber.org/zap/exp v0.3.0 // indirect
go.yaml.in/yaml/v2 v2.4.4 // indirect
go.yaml.in/yaml/v3 v3.0.4 // indirect
golang.org/x/crypto v0.49.0 // indirect
golang.org/x/mod v0.34.0 // indirect
golang.org/x/net v0.52.0 // indirect
golang.org/x/oauth2 v0.36.0 // indirect
golang.org/x/sync v0.20.0 // indirect
golang.org/x/sys v0.42.0 // indirect
golang.org/x/text v0.35.0 // indirect
golang.org/x/time v0.15.0 // indirect
golang.org/x/tools v0.43.0 // indirect
google.golang.org/api v0.272.0 // indirect
google.golang.org/genproto v0.0.0-20260316180232-0b37fe3546d5 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20260316180232-0b37fe3546d5 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20260316180232-0b37fe3546d5 // indirect
google.golang.org/grpc v1.79.2 // indirect
google.golang.org/protobuf v1.36.11 // indirect
gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
================================================
FILE: go.sum
================================================
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE=
cloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU=
cloud.google.com/go/auth v0.18.2 h1:+Nbt5Ev0xEqxlNjd6c+yYUeosQ5TtEUaNcN/3FozlaM=
cloud.google.com/go/auth v0.18.2/go.mod h1:xD+oY7gcahcu7G2SG2DsBerfFxgPAJz17zz2joOFF3M=
cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc=
cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c=
cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs=
cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10=
cloud.google.com/go/iam v1.5.3 h1:+vMINPiDF2ognBJ97ABAYYwRgsaqxPbQDlMnbHMjolc=
cloud.google.com/go/iam v1.5.3/go.mod h1:MR3v9oLkZCTlaqljW6Eb2d3HGDGK5/bDv93jhfISFvU=
cloud.google.com/go/pubsub/v2 v2.4.0 h1:oMKNiBQpXImRWnHYla9uSU66ZzByZwBSCJOEs/pTKVg=
cloud.google.com/go/pubsub/v2 v2.4.0/go.mod h1:2lS/XQKq5qtOMs6kHBK+WX1ytUC36kLl2ig3zqsGUx8=
code.pfad.fr/check v1.1.0 h1:GWvjdzhSEgHvEHe2uJujDcpmZoySKuHQNrZMfzfO0bE=
code.pfad.fr/check v1.1.0/go.mod h1:NiUH13DtYsb7xp5wll0U4SXx7KhXQVCtRgdC96IPfoM=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ=
github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY=
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
github.com/aws/aws-sdk-go-v2 v1.41.4 h1:10f50G7WyU02T56ox1wWXq+zTX9I1zxG46HYuG1hH/k=
github.com/aws/aws-sdk-go-v2 v1.41.4/go.mod h1:mwsPRE8ceUUpiTgF7QmQIJ7lgsKUPQOUl3o72QBrE1o=
github.com/aws/aws-sdk-go-v2/config v1.32.12 h1:O3csC7HUGn2895eNrLytOJQdoL2xyJy0iYXhoZ1OmP0=
github.com/aws/aws-sdk-go-v2/config v1.32.12/go.mod h1:96zTvoOFR4FURjI+/5wY1vc1ABceROO4lWgWJuxgy0g=
github.com/aws/aws-sdk-go-v2/credentials v1.19.12 h1:oqtA6v+y5fZg//tcTWahyN9PEn5eDU/Wpvc2+kJ4aY8=
github.com/aws/aws-sdk-go-v2/credentials v1.19.12/go.mod h1:U3R1RtSHx6NB0DvEQFGyf/0sbrpJrluENHdPy1j/3TE=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20 h1:zOgq3uezl5nznfoK3ODuqbhVg1JzAGDUhXOsU0IDCAo=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20/go.mod h1:z/MVwUARehy6GAg/yQ1GO2IMl0k++cu1ohP9zo887wE=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20 h1:CNXO7mvgThFGqOFgbNAP2nol2qAWBOGfqR/7tQlvLmc=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.20/go.mod h1:oydPDJKcfMhgfcgBUZaG+toBbwy8yPWubJXBVERtI4o=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20 h1:tN6W/hg+pkM+tf9XDkWUbDEjGLb+raoBMFsTodcoYKw=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.20/go.mod h1:YJ898MhD067hSHA6xYCx5ts/jEd8BSOLtQDL3iZsvbc=
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 h1:qYQ4pzQ2Oz6WpQ8T3HvGHnZydA72MnLuFK9tJwmrbHw=
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6/go.mod h1:O3h0IK87yXci+kg6flUKzJnWeziQUKciKrLjcatSNcY=
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 h1:5EniKhLZe4xzL7a+fU3C2tfUN4nWIqlLesfrjkuPFTY=
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7/go.mod h1:x0nZssQ3qZSnIcePWLvcoFisRXJzcTVvYpAAdYX8+GI=
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20 h1:2HvVAIq+YqgGotK6EkMf+KIEqTISmTYh5zLpYyeTo1Y=
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.20/go.mod h1:V4X406Y666khGa8ghKmphma/7C0DAtEQYhkq9z4vpbk=
github.com/aws/aws-sdk-go-v2/service/signin v1.0.8 h1:0GFOLzEbOyZABS3PhYfBIx2rNBACYcKty+XGkTgw1ow=
github.com/aws/aws-sdk-go-v2/service/signin v1.0.8/go.mod h1:LXypKvk85AROkKhOG6/YEcHFPoX+prKTowKnVdcaIxE=
github.com/aws/aws-sdk-go-v2/service/sqs v1.42.24 h1:JP2wjWGmUp8lTCZb13Dv0Eciyc1jbO8pd0HZVMHFlrc=
github.com/aws/aws-sdk-go-v2/service/sqs v1.42.24/go.mod h1:Ql9ziDutk8ERAN9HMaYANCW3lop451ppebkxEJMLCTM=
github.com/aws/aws-sdk-go-v2/service/sso v1.30.13 h1:kiIDLZ005EcKomYYITtfsjn7dtOwHDOFy7IbPXKek2o=
github.com/aws/aws-sdk-go-v2/service/sso v1.30.13/go.mod h1:2h/xGEowcW/g38g06g3KpRWDlT+OTfxxI0o1KqayAB8=
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17 h1:jzKAXIlhZhJbnYwHbvUQZEB8KfgAEuG0dc08Bkda7NU=
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17/go.mod h1:Al9fFsXjv4KfbzQHGe6V4NZSZQXecFcvaIF4e70FoRA=
github.com/aws/aws-sdk-go-v2/service/sts v1.41.9 h1:Cng+OOwCHmFljXIxpEVXAGMnBia8MSU6Ch5i9PgBkcU=
github.com/aws/aws-sdk-go-v2/service/sts v1.41.9/go.mod h1:LrlIndBDdjA/EeXeyNBle+gyCwTlizzW5ycgWnvIxkk=
github.com/aws/smithy-go v1.24.2 h1:FzA3bu/nt/vDvmnkg+R8Xl46gmzEDam6mZ1hzmwXFng=
github.com/aws/smithy-go v1.24.2/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc=
github.com/beanstalkd/go-beanstalk v0.2.0 h1:6UOJugnu47uNB2jJO/lxyDgeD1Yds7owYi1USELqexA=
github.com/beanstalkd/go-beanstalk v0.2.0/go.mod h1:/G8YTyChOtpOArwLTQPY1CHB+i212+av35bkPXXj56Y=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/bmatcuk/doublestar/v4 v4.10.0 h1:zU9WiOla1YA122oLM6i4EXvGW62DvKZVxIe6TYWexEs=
github.com/bmatcuk/doublestar/v4 v4.10.0/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc=
github.com/bradfitz/gomemcache v0.0.0-20250403215159-8d39553ac7cf h1:TqhNAT4zKbTdLa62d2HDBFdvgSbIGB3eJE8HqhgiL9I=
github.com/bradfitz/gomemcache v0.0.0-20250403215159-8d39553ac7cf/go.mod h1:r5xuitiExdLAJ09PR7vBVENGvp4ZuTBeWTGtxuX3K+c=
github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=
github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=
github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=
github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=
github.com/buger/goterm v1.0.4 h1:Z9YvGmOih81P0FbVtEYTFF6YsSgxSUKEhf/f9bTMXbY=
github.com/buger/goterm v1.0.4/go.mod h1:HiFWV3xnkolgrBV3mY8m0X0Pumt4zg4QhbdOzQtB8tE=
github.com/cactus/go-statsd-client/statsd v0.0.0-20200423205355-cb0885a1018c/go.mod h1:l/bIBLeOl9eX+wxJAzxS4TveKRtAqlyDpHjhkfO0MEI=
github.com/cactus/go-statsd-client/v5 v5.1.0 h1:sbbdfIl9PgisjEoXzvXI1lwUKWElngsjJKaZeC021P4=
github.com/cactus/go-statsd-client/v5 v5.1.0/go.mod h1:COEvJ1E+/E2L4q6QE5CkjWPi4eeDw9maJBMIuMPBZbY=
github.com/caddyserver/certmagic v0.25.2 h1:D7xcS7ggX/WEY54x0czj7ioTkmDWKIgxtIi2OcQclUc=
github.com/caddyserver/certmagic v0.25.2/go.mod h1:llW/CvsNmza8S6hmsuggsZeiX+uS27dkqY27wDIuBWg=
github.com/caddyserver/zerossl v0.1.5 h1:dkvOjBAEEtY6LIGAHei7sw2UgqSD6TrWweXpV7lvEvE=
github.com/caddyserver/zerossl v0.1.5/go.mod h1:CxA0acn7oEGO6//4rtrRjYgEoa4MFw/XofZnrYwGqG4=
github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=
github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM=
github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/clipperhouse/displaywidth v0.11.0 h1:lBc6kY44VFw+TDx4I8opi/EtL9m20WSEFgwIwO+UVM8=
github.com/clipperhouse/displaywidth v0.11.0/go.mod h1:bkrFNkf81G8HyVqmKGxsPufD3JhNl3dSqnGhOoSD/o0=
github.com/clipperhouse/uax29/v2 v2.7.0 h1:+gs4oBZ2gPfVrKPthwbMzWZDaAFPGYK72F0NJv2v7Vk=
github.com/clipperhouse/uax29/v2 v2.7.0/go.mod h1:EFJ2TJMRUaplDxHKj1qAEhCtQPW2tJSwu5BF98AuoVM=
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5 h1:6xNmx7iTtyBRev0+D/Tv1FZd4SCg8axKApyNyRsAt/w=
github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5/go.mod h1:KdCmV+x/BuvyMxRnYBlmVaq4OLiKW6iRQfvC62cvdkI=
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
github.com/emicklei/proto v1.14.3 h1:zEhlzNkpP8kN6utonKMzlPfIvy82t5Kb9mufaJxSe1Q=
github.com/emicklei/proto v1.14.3/go.mod h1:rn1FgRS/FANiZdD2djyH7TMA9jdRDcYQ9IEN9yvjX0A=
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
github.com/envoyproxy/go-control-plane v0.14.0 h1:hbG2kr4RuFj222B6+7T83thSPqLjwBIfQawTkC++2HA=
github.com/envoyproxy/go-control-plane/envoy v1.36.0 h1:yg/JjO5E7ubRyKX3m07GF3reDNEnfOboJ0QySbH736g=
github.com/envoyproxy/go-control-plane/envoy v1.36.0/go.mod h1:ty89S1YCCVruQAm9OtKeEkQLTb+Lkz0k8v9W0Oxsv98=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/envoyproxy/protoc-gen-validate v1.3.0 h1:TvGH1wof4H33rezVKWSpqKz5NXWg5VPuZ0uONDT6eb4=
github.com/envoyproxy/protoc-gen-validate v1.3.0/go.mod h1:HvYl7zwPa5mffgyeTUHA9zHIH36nmrm7oCbo4YKoSWA=
github.com/facebookgo/clock v0.0.0-20150410010913-600d898af40a h1:yDWHCSQ40h88yih2JAcL6Ls/kVkSE8GFACTGVnMPruw=
github.com/facebookgo/clock v0.0.0-20150410010913-600d898af40a/go.mod h1:7Ga40egUymuWXxAe151lTNnCv97MddSOVsjpPPkityA=
github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=
github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=
github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k=
github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/go-jose/go-jose/v4 v4.1.3 h1:CVLmWDhDVRa6Mi/IgCgaopNosCaHz7zrMeF9MlZRkrs=
github.com/go-jose/go-jose/v4 v4.1.3/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08=
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE=
github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/go-viper/mapstructure/v2 v2.5.0 h1:vM5IJoUAy3d7zRSVtIwQgBj7BiWtMPfmPEgAXnvj1Ro=
github.com/go-viper/mapstructure/v2 v2.5.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
github.com/goccy/go-json v0.10.6 h1:p8HrPJzOakx/mn/bQtjgNjdTcN+/S6FcG2CTtQOrHVU=
github.com/goccy/go-json v0.10.6/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
github.com/gofiber/fiber/v2 v2.52.12 h1:0LdToKclcPOj8PktUdIKo9BUohjjwfnQl42Dhw8/WUw=
github.com/gofiber/fiber/v2 v2.52.12/go.mod h1:YEcBbO/FB+5M1IZNBP9FO3J9281zgPAreiI1oqg8nDw=
github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s=
github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4=
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ=
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw=
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U=
github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0=
github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM=
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/googleapis/enterprise-certificate-proxy v0.3.14 h1:yh8ncqsbUY4shRD5dA6RlzjJaT4hi3kII+zYw8wmLb8=
github.com/googleapis/enterprise-certificate-proxy v0.3.14/go.mod h1:vqVt9yG9480NtzREnTlmGSBmFrA+bzb0yl0TxoBQXOg=
github.com/googleapis/gax-go/v2 v2.18.0 h1:jxP5Uuo3bxm3M6gGtV94P4lliVetoCB4Wk2x8QA86LI=
github.com/googleapis/gax-go/v2 v2.18.0/go.mod h1:uSzZN4a356eRG985CzJ3WfbFSpqkLTjsnhWGJR6EwrE=
github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y=
github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.3 h1:B+8ClL/kCQkRiU82d9xajRPKYMrB7E0MbtzWVi1K4ns=
github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.3/go.mod h1:NbCUVmiS4foBGBHOYlCT25+YmGpJ32dZPi75pGEUpj4=
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 h1:HWRh5R2+9EifMyIHV7ZV+MIZqgz+PMpZ14Jynv3O2Zs=
github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0/go.mod h1:JfhWUomR1baixubs02l85lZYYOm7LV6om4ceouMv45c=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/klauspost/compress v1.18.4 h1:RPhnKRAQ4Fh8zU2FY/6ZFDwTVTxgJ/EMydqSTzE9a2c=
github.com/klauspost/compress v1.18.4/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4=
github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y=
github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
github.com/letsencrypt/challtestsrv v1.4.2 h1:0ON3ldMhZyWlfVNYYpFuWRTmZNnyfiL9Hh5YzC3JVwU=
github.com/letsencrypt/challtestsrv v1.4.2/go.mod h1:GhqMqcSoeGpYd5zX5TgwA6er/1MbWzx/o7yuuVya+Wk=
github.com/letsencrypt/pebble/v2 v2.10.0 h1:Wq6gYXlsY6ubqI3hhxsTzdyotvfdjFBxuwYqCLCnj/U=
github.com/letsencrypt/pebble/v2 v2.10.0/go.mod h1:Sk8cmUIPcIdv2nINo+9PB4L+ZBhzY+F9A1a/h/xmWiQ=
github.com/libdns/libdns v1.1.1 h1:wPrHrXILoSHKWJKGd0EiAVmiJbFShguILTg9leS/P/U=
github.com/libdns/libdns v1.1.1/go.mod h1:4Bj9+5CQiNMVGf87wjX4CY3HQJypUHRuLvlsfsZqLWQ=
github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=
github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mattn/go-runewidth v0.0.21 h1:jJKAZiQH+2mIinzCJIaIG9Be1+0NR+5sz/lYEEjdM8w=
github.com/mattn/go-runewidth v0.0.21/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/mholt/acmez v1.2.0 h1:1hhLxSgY5FvH5HCnGUuwbKY2VQVo8IU7rxXKSnZ7F30=
github.com/mholt/acmez v1.2.0/go.mod h1:VT9YwH1xgNX1kmYY89gY8xPJC84BFAisjo8Egigt4kE=
github.com/mholt/acmez/v3 v3.1.6 h1:eGVQNObP0pBN4sxqrXeg7MYqTOWyoiYpQqITVWlrevk=
github.com/mholt/acmez/v3 v3.1.6/go.mod h1:5nTPosTGosLxF3+LU4ygbgMRFDhbAVpqMI4+a4aHLBY=
github.com/miekg/dns v1.1.72 h1:vhmr+TF2A3tuoGNkLDFK9zi36F2LS+hKTRW0Uf8kbzI=
github.com/miekg/dns v1.1.72/go.mod h1:+EuEPhdHOsfk6Wk5TT2CzssZdqkmFhf8r+aVyDEToIs=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
github.com/nats-io/nats.go v1.49.0 h1:yh/WvY59gXqYpgl33ZI+XoVPKyut/IcEaqtsiuTJpoE=
github.com/nats-io/nats.go v1.49.0/go.mod h1:fDCn3mN5cY8HooHwE2ukiLb4p4G4ImmzvXyJt+tGwdw=
github.com/nats-io/nkeys v0.4.15 h1:JACV5jRVO9V856KOapQ7x+EY8Jo3qw1vJt/9Jpwzkk4=
github.com/nats-io/nkeys v0.4.15/go.mod h1:CpMchTXC9fxA5zrMo4KpySxNjiDVvr8ANOSZdiNfUrs=
github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw=
github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
github.com/nexus-rpc/sdk-go v0.6.0 h1:QRgnP2zTbxEbiyWG/aXH8uSC5LV/Mg1fqb19jb4DBlo=
github.com/nexus-rpc/sdk-go v0.6.0/go.mod h1:FHdPfVQwRuJFZFTF0Y2GOAxCrbIBNrcPna9slkGKPYk=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
github.com/olekukonko/cat v0.0.0-20250911104152-50322a0618f6 h1:zrbMGy9YXpIeTnGj4EljqMiZsIcE09mmF8XsD5AYOJc=
github.com/olekukonko/cat v0.0.0-20250911104152-50322a0618f6/go.mod h1:rEKTHC9roVVicUIfZK7DYrdIoM0EOr8mK1Hj5s3JjH0=
github.com/olekukonko/errors v1.2.0 h1:10Zcn4GeV59t/EGqJc8fUjtFT/FuUh5bTMzZ1XwmCRo=
github.com/olekukonko/errors v1.2.0/go.mod h1:ppzxA5jBKcO1vIpCXQ9ZqgDh8iwODz6OXIGKU8r5m4Y=
github.com/olekukonko/ll v0.1.7 h1:WyK1YZwOTUKHEXZz3VydBDT5t3zDqa9yI8iJg5PHon4=
github.com/olekukonko/ll v0.1.7/go.mod h1:RPRC6UcscfFZgjo1nulkfMH5IM0QAYim0LfnMvUuozw=
github.com/olekukonko/tablewriter v1.1.4 h1:ORUMI3dXbMnRlRggJX3+q7OzQFDdvgbN9nVWj1drm6I=
github.com/olekukonko/tablewriter v1.1.4/go.mod h1:+kedxuyTtgoZLwif3P1Em4hARJs+mVnzKxmsCL/C5RY=
github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
github.com/openzipkin/zipkin-go v0.4.3 h1:9EGwpqkgnwdEIJ+Od7QVSEIH+ocmm5nPat0G7sjsSdg=
github.com/openzipkin/zipkin-go v0.4.3/go.mod h1:M9wCJZFWCo2RiY+o1eBCEMe0Dp2S5LDHcMZmk3RmK7c=
github.com/pborman/uuid v1.2.1/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4=
github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=
github.com/pierrec/lz4/v4 v4.1.26 h1:GrpZw1gZttORinvzBdXPUXATeqlJjqUG/D87TKMnhjY=
github.com/pierrec/lz4/v4 v4.1.26/go.mod h1:EoQMVJgeeEOMsCqCzqFm2O0cJvljX2nGZjcRIPL34O4=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo=
github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o=
github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg=
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=
github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE=
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
github.com/prometheus/common v0.67.5 h1:pIgK94WWlQt1WLwAC5j2ynLaBRDiinoAb86HZHTUGI4=
github.com/prometheus/common v0.67.5/go.mod h1:SjE/0MzDEEAyrdr5Gqc6G+sXI67maCxzaT3A2+HqjUw=
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
github.com/prometheus/procfs v0.20.1 h1:XwbrGOIplXW/AU3YhIhLODXMJYyC1isLFfYCsTEycfc=
github.com/prometheus/procfs v0.20.1/go.mod h1:o9EMBZGRyvDrSPH1RqdxhojkuXstoe4UlK79eF5TGGo=
github.com/quic-go/qpack v0.6.0 h1:g7W+BMYynC1LbYLSqRt8PBg5Tgwxn214ZZR34VIOjz8=
github.com/quic-go/qpack v0.6.0/go.mod h1:lUpLKChi8njB4ty2bFLX2x4gzDqXwUpaO1DP9qMDZII=
github.com/quic-go/quic-go v0.59.0 h1:OLJkp1Mlm/aS7dpKgTc6cnpynnD2Xg7C1pwL6vy/SAw=
github.com/quic-go/quic-go v0.59.0/go.mod h1:upnsH4Ju1YkqpLXC305eW3yDZ4NfnNbmQRCMWS58IKU=
github.com/rabbitmq/amqp091-go v1.10.0 h1:STpn5XsHlHGcecLmMFCtg7mqq0RnD+zFr4uzukfVhBw=
github.com/rabbitmq/amqp091-go v1.10.0/go.mod h1:Hy4jKW5kQART1u+JkDTF9YYOQUHXqMuhrgxOEeS7G4o=
github.com/redis/go-redis/extra/rediscmd/v9 v9.18.0 h1:QY4nmPHLFAJjtT5O4OMUEOxP8WVaRNOFpcbmxT2NLZU=
github.com/redis/go-redis/extra/rediscmd/v9 v9.18.0/go.mod h1:WH8cY/0fT41Bsf341qzo8v4nx0GCE8FykAA23IVbVmo=
github.com/redis/go-redis/extra/redisotel/v9 v9.18.0 h1:2dKdoEYBJ0CZCLPiCdvvc7luz3DPwY6hKdzjL6m1eHE=
github.com/redis/go-redis/extra/redisotel/v9 v9.18.0/go.mod h1:WzkrVG9ro9BwCQD0eJOWn6AGL4Z1CleGflM45w1hu10=
github.com/redis/go-redis/extra/redisprometheus/v9 v9.18.0 h1:i4WuWCYs4kYB/UKZvRUUlQ8214KIpE+0svtzTwBmdUY=
github.com/redis/go-redis/extra/redisprometheus/v9 v9.18.0/go.mod h1:Ji1RzjPy388jVCLG0uYRyVnp4PD1dzGRiXvax9yXKPA=
github.com/redis/go-redis/v9 v9.18.0 h1:pMkxYPkEbMPwRdenAzUNyFNrDgHx9U+DrBabWNfSRQs=
github.com/redis/go-redis/v9 v9.18.0/go.mod h1:k3ufPphLU5YXwNTUcCRXGxUoF1fqxnhFQmscfkCoDA0=
github.com/roadrunner-server/amqp/v5 v5.2.3 h1:joOO8csUbv9IN2Q2E+dqlaMOkwi7fjmul9wNeG0AHHc=
github.com/roadrunner-server/amqp/v5 v5.2.3/go.mod h1:hjp/CCrpkCVS/k19f+IsNQ8CCUDBjhpn0An4tKKcTGs=
github.com/roadrunner-server/api/v4 v4.23.0 h1:lrVXgP4ozD/H5DrIdT181ldVhD1R9QT5qsi8qWUTDF4=
github.com/roadrunner-server/api/v4 v4.23.0/go.mod h1:AlHuVVOklb7XF33Cf7IfmwOn3j4gGg37on9Xi6j08Bg=
github.com/roadrunner-server/app-logger/v5 v5.1.9 h1:CNSBqdVli60d0n8LneqVyea52z1/esLpv5A0J6K1U8E=
github.com/roadrunner-server/app-logger/v5 v5.1.9/go.mod h1:F80BR3sa9RkhraBwdhkS+ZSjWPzqzhRmqohJih2MVWU=
github.com/roadrunner-server/beanstalk/v5 v5.1.9 h1:PHY/K1oQVxFBswTu0B3KIj8xy4nEYbkumcrmvhv6orI=
github.com/roadrunner-server/beanstalk/v5 v5.1.9/go.mod h1:w0ghg+tAnR/eowGPej35GMkyYnCa82L9qy504DltK+w=
github.com/roadrunner-server/boltdb/v5 v5.1.9 h1:UWpxBrY0SECbNl3jG7ZmNXSMGe5OQaKMKZvHYHkz+VE=
github.com/roadrunner-server/boltdb/v5 v5.1.9/go.mod h1:THo9ebdAAaWffKDzmPKVLm4e6oncIcoqlgQ2RdI/fE8=
github.com/roadrunner-server/centrifuge/v5 v5.1.9 h1:rkXRR6JFAUTHMQhqS0RiLciQDhF55VwAoN5SK7JaBqY=
github.com/roadrunner-server/centrifuge/v5 v5.1.9/go.mod h1:N015rsGdTD7dDIkNeYidwBXQoseizHltv3q94tRzIic=
github.com/roadrunner-server/config/v5 v5.1.9 h1:ReWwts/prEvuC4yVJ0BRDmY5sxw/1c+hGTSdJ71hIQU=
github.com/roadrunner-server/config/v5 v5.1.9/go.mod h1:R6YyTWahW61tWHOI2BfdkQU/0Zc/2d6/JbJ/KEvq8F8=
github.com/roadrunner-server/context v1.3.0 h1:iyTXVORhPU2/26z7kdzEaggwG5P8yhIKUDLiePjylFQ=
github.com/roadrunner-server/context v1.3.0/go.mod h1:KPAzAlnErXekQazW9t4h55U1S42Q2bk0WCaPQrezJw4=
github.com/roadrunner-server/endure/v2 v2.6.2 h1:sIB4kTyE7gtT3fDhuYWUYn6Vt/dcPtiA6FoNS1eS+84=
github.com/roadrunner-server/endure/v2 v2.6.2/go.mod h1:t/2+xpNYgGBwhzn83y2MDhvhZ19UVq1REcvqn7j7RB8=
github.com/roadrunner-server/errors v1.4.1 h1:LKNeaCGiwd3t8IaL840ZNF3UA9yDQlpvHnKddnh0YRQ=
github.com/roadrunner-server/errors v1.4.1/go.mod h1:qeffnIKG0e4j1dzGpa+OGY5VKSfMphizvqWIw8s2lAo=
github.com/roadrunner-server/events v1.0.1 h1:waCkKhxhzdK3VcI1xG22l+h+0J+Nfdpxjhyy01Un+kI=
github.com/roadrunner-server/events v1.0.1/go.mod h1:WZRqoEVaFm209t52EuoT7ISUtvX6BrCi6bI/7pjkVC0=
github.com/roadrunner-server/fileserver/v5 v5.1.9 h1:IcEYqlB+jtyb1ZLnId3j4LyOKvifEbh2MJY6oiAGn3o=
github.com/roadrunner-server/fileserver/v5 v5.1.9/go.mod h1:P2ww1ycCNdWEp7/lHLukfbIq4vYn4ZbV4INCh128q9s=
github.com/roadrunner-server/google-pub-sub/v5 v5.1.9 h1:D8s0JiTPP11HKaPKtcQ6R6+Y/rFJ83KFP4utbDOdgsE=
github.com/roadrunner-server/google-pub-sub/v5 v5.1.9/go.mod h1:SvsSxJ2k640krtMP5Q35tDDH1v5LFcrMjXhvFJwbr7o=
github.com/roadrunner-server/goridge/v3 v3.8.3 h1:XmjrOFnI6ZbQTPaP39DEk8KwLUNTgjluK3pcZaW6ixQ=
github.com/roadrunner-server/goridge/v3 v3.8.3/go.mod h1:4TZU8zgkKIZCsH51qwGMpvyXCT59u/8z6q8sCe4ZGAQ=
github.com/roadrunner-server/grpc/v5 v5.3.0 h1:DZj7b6vU+1bo5oAAUil75JUuovAwZzXh41ZS7rUE6xQ=
github.com/roadrunner-server/grpc/v5 v5.3.0/go.mod h1:A3G5eJZMQYnbzWWZ9crPSS557wPfwEc3uWr48RtbAVQ=
github.com/roadrunner-server/gzip/v5 v5.3.0 h1:l6H4NQmX2RaaTWkeEt0q39ITLcMKL8FmBXm3ENUE4oI=
github.com/roadrunner-server/gzip/v5 v5.3.0/go.mod h1:fXhfwelVKIJvon8jEdZrqobbE1zJoQkN3Ov7mO3V5XI=
github.com/roadrunner-server/headers/v5 v5.2.0 h1:Q8SYxr+zhj5VskDPKq3JYyZA3XqcGxtYcb5uh4FytFY=
github.com/roadrunner-server/headers/v5 v5.2.0/go.mod h1:BEeI6pI0CyVjE8gG6H5LVPRxZ2kDtMFoHupFE2SG2wU=
github.com/roadrunner-server/http/v5 v5.3.0 h1:gsNdOQffWF3/hL7T+OTQat36SvCl5ZUjuotz41rONQ4=
github.com/roadrunner-server/http/v5 v5.3.0/go.mod h1:JCM8jmgRtaPMFiKPcriOxNQ98ha821uzN5BQ5XJzc1I=
github.com/roadrunner-server/informer/v5 v5.1.9 h1:yl334LMqUoWXfeP4299HgY9G7mq6kX6FVCSwT+cYdfQ=
github.com/roadrunner-server/informer/v5 v5.1.9/go.mod h1:JPzSsDjLHExdQ9SbT9e8H/oB7pajgCScL/G70saQzSA=
github.com/roadrunner-server/jobs/v5 v5.1.9 h1:28biT9tGTYSXV+FWJCLfEOCV3sJZ7VVd46oJLhIfJkM=
github.com/roadrunner-server/jobs/v5 v5.1.9/go.mod h1:3qiklMKRqMHl0+TbrFQWzaNrtqDGkPFdgZC/dFqRBNU=
github.com/roadrunner-server/kafka/v5 v5.2.5 h1:Abqb9AnFsx5VYsJqP5YwloWHaBbdbGrhX8NkWJk6s74=
github.com/roadrunner-server/kafka/v5 v5.2.5/go.mod h1:dAAwqsb+uJSZBOO+jtcM1ENgC7zZSOijxU1xSd4n8/w=
github.com/roadrunner-server/kv/v5 v5.2.9 h1:vVUwmt2lxvdf6pILvfOFj57htFBedgQT8jnnwmI7pKU=
github.com/roadrunner-server/kv/v5 v5.2.9/go.mod h1:KibOhjOyOk+3ULzPhEEisCmCQQjFxVu5fXJGSVbsJUU=
github.com/roadrunner-server/lock/v5 v5.1.9 h1:4juUwNvvS13mVnu131sHlgGRjuS5V0cfPPL+7fT6yt8=
github.com/roadrunner-server/lock/v5 v5.1.9/go.mod h1:PNQWcwGMboDvG2XCxXQfn3j3tpCGNi5CHGxGo7cyV4Y=
github.com/roadrunner-server/logger/v5 v5.1.9 h1:3Kn+NYXF7Ww5LvkwMZwkv1q99t5qusIPBsreRJL08JI=
github.com/roadrunner-server/logger/v5 v5.1.9/go.mod h1:hwct/TWTmxYsVzowLx4g9HkY5z2/gpYOC+UN8btsrAA=
github.com/roadrunner-server/memcached/v5 v5.1.9 h1:Pom9dZuywQK6ayWQYHbO7STar08/WeBl5WWckUFP51U=
github.com/roadrunner-server/memcached/v5 v5.1.9/go.mod h1:AT1p3Vy1J8eJbCiojB9usKiMHCQpyxkKa+0T1Wd705U=
github.com/roadrunner-server/memory/v5 v5.2.9 h1:niLep2dyUaYhrn+I12kTXjGUTUSbVJa+jyvNJrbt/hw=
github.com/roadrunner-server/memory/v5 v5.2.9/go.mod h1:UcE3Sf0TYRmAG1HukXmzsztGD0nBi6RRhG75K11Fqpk=
github.com/roadrunner-server/metrics/v5 v5.2.0 h1:54MWLO9t0tgx2It3sEx/Zz7rFwpYk6g9rjvApFBXTUQ=
github.com/roadrunner-server/metrics/v5 v5.2.0/go.mod h1:GRr9V0zI2XY9CmoCwW3wyUcFSQq98Lm0ENp77jYgzF0=
github.com/roadrunner-server/nats/v5 v5.1.9 h1:ZWXMSt+za709hIK6jUBYv6X92REk1DgsYa6zU0jbeKo=
github.com/roadrunner-server/nats/v5 v5.1.9/go.mod h1:6R6q7wR7OKl9kxsLZd3Qz2jobwv0t5ohj1EZ/zSBXM8=
github.com/roadrunner-server/otel/v5 v5.5.0 h1:IYMw04K110sMANyZpauvQ3rRMnq0zZhwQbISHLisfQE=
github.com/roadrunner-server/otel/v5 v5.5.0/go.mod h1:B1EaW4hC2VGUKCKLw9CZYKxuQid+2Zb7ojzXpRUb6oo=
github.com/roadrunner-server/pool v1.1.3 h1:KMsiL6yuYBWGk73bdO
gitextract_hav1tonz/
├── .claude/
│ └── settings.json
├── .dockerignore
├── .editorconfig
├── .githooks/
│ └── pre-commit
├── .github/
│ ├── CODEOWNERS
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug-report.yml
│ │ ├── chore.yml
│ │ ├── config.yml
│ │ └── feature-request.yml
│ ├── dependabot.yml
│ ├── pull_request_template.md
│ └── workflows/
│ ├── codeql-analysis.yml
│ ├── dependency-review.yml
│ ├── e2e.yml
│ ├── release.yml
│ ├── release_dep.yml
│ ├── release_dep_aarch64.yml
│ ├── release_grpc.yml
│ ├── semgrep.yml
│ └── tests.yml
├── .gitignore
├── .golangci.yml
├── .rr.yaml
├── .vscode/
│ └── launch.json
├── CHANGELOG.md
├── CLAUDE.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Dockerfile
├── LICENSE
├── Makefile
├── README.md
├── SECURITY.md
├── benchmarks/
│ └── simple.js
├── cmd/
│ └── rr/
│ ├── command_test.go
│ ├── doc.go
│ └── main.go
├── codecov.yml
├── composer.json
├── container/
│ ├── config.go
│ ├── config_test.go
│ ├── container_test.go
│ ├── doc.go
│ ├── plugins.go
│ ├── plugins_test.go
│ └── test/
│ ├── endure_ok.yaml
│ ├── endure_ok_debug.yaml
│ ├── endure_ok_error.yaml
│ ├── endure_ok_foobar.yaml
│ ├── endure_ok_info.yaml
│ ├── endure_ok_warn.yaml
│ └── without_endure_ok.yaml
├── download-latest.sh
├── githooks-installer.sh
├── go.mod
├── go.sum
├── go.work
├── go.work.sum
├── internal/
│ ├── cli/
│ │ ├── doc.go
│ │ ├── jobs/
│ │ │ ├── command.go
│ │ │ ├── command_test.go
│ │ │ ├── doc.go
│ │ │ ├── render.go
│ │ │ └── subcommands.go
│ │ ├── reset/
│ │ │ ├── command.go
│ │ │ ├── command_test.go
│ │ │ └── doc.go
│ │ ├── root.go
│ │ ├── root_test.go
│ │ ├── serve/
│ │ │ ├── command.go
│ │ │ ├── command_test.go
│ │ │ ├── command_windows.go
│ │ │ └── doc.go
│ │ ├── stop/
│ │ │ ├── command.go
│ │ │ ├── command_test.go
│ │ │ └── doc.go
│ │ └── workers/
│ │ ├── command.go
│ │ ├── command_test.go
│ │ ├── doc.go
│ │ └── render.go
│ ├── debug/
│ │ ├── doc.go
│ │ ├── server.go
│ │ └── server_test.go
│ ├── meta/
│ │ ├── doc.go
│ │ ├── meta.go
│ │ └── meta_test.go
│ ├── rpc/
│ │ ├── client.go
│ │ ├── client_test.go
│ │ ├── doc.go
│ │ ├── includes.go
│ │ └── test/
│ │ ├── config_rpc_conn_err.yaml
│ │ ├── config_rpc_empty.yaml
│ │ ├── config_rpc_ok.yaml
│ │ ├── config_rpc_ok_env.yaml
│ │ ├── config_rpc_wrong.yaml
│ │ └── include1/
│ │ ├── .rr-include.yaml
│ │ └── .rr.yaml
│ └── sdnotify/
│ ├── doc.go
│ └── sdnotify.go
├── lib/
│ ├── doc.go
│ ├── roadrunner.go
│ └── roadrunner_test.go
├── schemas/
│ ├── config/
│ │ ├── 1.0.schema.json
│ │ ├── 2.0.schema.json
│ │ └── 3.0.schema.json
│ ├── package.json
│ ├── readme.md
│ └── test.js
└── tests/
├── configs/
│ ├── .rr-grpc-otel.yaml
│ ├── .rr-grpc.yaml
│ ├── .rr-http-middleware.yaml
│ ├── .rr-http-otel.yaml
│ ├── .rr-http-static.yaml
│ ├── .rr-jobs-memory-otel.yaml
│ └── .rr-jobs-memory.yaml
├── doc.go
├── e2e_grpc_test.go
├── e2e_http_test.go
├── e2e_jobs_test.go
├── go.mod
├── go.sum
├── helpers/
│ ├── doc.go
│ └── helpers.go
├── mock/
│ ├── doc.go
│ ├── logger.go
│ └── observer.go
├── php_test_files/
│ ├── .gitignore
│ ├── composer.json
│ ├── grpc/
│ │ ├── src/
│ │ │ ├── EchoService.php
│ │ │ ├── GPBMetadata/
│ │ │ │ └── Service.php
│ │ │ ├── Health/
│ │ │ │ ├── HealthCheckRequest.php
│ │ │ │ ├── HealthCheckResponse/
│ │ │ │ │ └── ServingStatus.php
│ │ │ │ ├── HealthCheckResponse.php
│ │ │ │ └── HealthInterface.php
│ │ │ ├── HealthService.php
│ │ │ └── Service/
│ │ │ ├── EchoInterface.php
│ │ │ └── Message.php
│ │ └── worker-grpc.php
│ ├── http/
│ │ ├── client.php
│ │ └── echo.php
│ └── jobs/
│ └── jobs_ok.php
├── proto/
│ └── service/
│ ├── service.pb.go
│ ├── service.proto
│ └── service_grpc.pb.go
└── testdata/
└── sample.txt
SYMBOL INDEX (227 symbols across 51 files)
FILE: cmd/rr/command_test.go
function Test_Main (line 13) | func Test_Main(t *testing.T) {
function Test_MainWithoutCommands (line 32) | func Test_MainWithoutCommands(t *testing.T) {
function Test_MainUnknownSubcommand (line 49) | func Test_MainUnknownSubcommand(t *testing.T) {
FILE: cmd/rr/main.go
function main (line 15) | func main() { exitFn(run()) }
function run (line 18) | func run() int {
FILE: container/config.go
type Config (line 12) | type Config struct
constant endureKey (line 21) | endureKey = "endure"
constant defaultGracePeriod (line 23) | defaultGracePeriod = time.Second * 30
function NewConfig (line 27) | func NewConfig(cfgFile string) (*Config, error) {
function ParseLogLevel (line 54) | func ParseLogLevel(s string) (slog.Leveler, error) {
FILE: container/config_test.go
function TestNewConfig_SuccessfulReading (line 13) | func TestNewConfig_SuccessfulReading(t *testing.T) {
function TestNewConfig_WithoutEndureKey (line 26) | func TestNewConfig_WithoutEndureKey(t *testing.T) {
function TestNewConfig_LoggingLevels (line 42) | func TestNewConfig_LoggingLevels(t *testing.T) {
FILE: container/container_test.go
function TestNewContainer (line 12) | func TestNewContainer(t *testing.T) { // there is no legal way to test c...
FILE: container/plugins.go
function Plugins (line 42) | func Plugins() []any { //nolint:funlen
FILE: container/plugins_test.go
function TestPlugins (line 8) | func TestPlugins(t *testing.T) {
FILE: internal/cli/jobs/command.go
constant listRPC (line 13) | listRPC string = "jobs.List"
constant pauseRPC (line 14) | pauseRPC string = "jobs.Pause"
constant destroyRPC (line 15) | destroyRPC string = "jobs.Destroy"
constant resumeRPC (line 16) | resumeRPC string = "jobs.Resume"
function NewCommand (line 20) | func NewCommand(cfgFile *string, override *[]string, silent *bool) *cobr...
FILE: internal/cli/jobs/command_test.go
function TestCommandProperties (line 10) | func TestCommandProperties(t *testing.T) {
FILE: internal/cli/jobs/render.go
function renderPipelines (line 11) | func renderPipelines(writer io.Writer, pipelines []string) *tablewriter....
FILE: internal/cli/jobs/subcommands.go
function pause (line 10) | func pause(client *rpc.Client, pause []string, silent *bool) error {
function resume (line 26) | func resume(client *rpc.Client, resume []string, silent *bool) error {
function destroy (line 42) | func destroy(client *rpc.Client, destroy []string, silent *bool) error {
function list (line 58) | func list(client *rpc.Client) error {
FILE: internal/cli/reset/command.go
constant op (line 15) | op = errors.Op("reset_handler")
constant resetterList (line 16) | resetterList = "resetter.List"
constant resetterReset (line 17) | resetterReset = "resetter.Reset"
function NewCommand (line 21) | func NewCommand(cfgFile *string, override *[]string, silent *bool) *cobr...
FILE: internal/cli/reset/command_test.go
function TestCommandProperties (line 11) | func TestCommandProperties(t *testing.T) {
FILE: internal/cli/root.go
constant envDotenv (line 29) | envDotenv string = "DOTENV_PATH"
constant pidFileName (line 30) | pidFileName string = ".pid"
function NewCommand (line 34) | func NewCommand(cmdName string) *cobra.Command { //nolint:funlen,gocognit
function toPtr (line 172) | func toPtr[T any](val T) *T {
FILE: internal/cli/root_test.go
function TestCommandSubcommands (line 15) | func TestCommandSubcommands(t *testing.T) {
function TestCommandFlags (line 41) | func TestCommandFlags(t *testing.T) {
function TestCommandSimpleExecuting (line 72) | func TestCommandSimpleExecuting(t *testing.T) {
function TestCommandNoEnvFileError (line 88) | func TestCommandNoEnvFileError(t *testing.T) {
function TestCommandNoEnvFileNoError (line 104) | func TestCommandNoEnvFileNoError(t *testing.T) {
function TestCommandWorkingDir (line 137) | func TestCommandWorkingDir(t *testing.T) {
FILE: internal/cli/serve/command.go
function log (line 22) | func log(msg string, silent bool) {
function NewCommand (line 28) | func NewCommand(override *[]string, cfgFile *string, silent *bool, exper...
FILE: internal/cli/serve/command_test.go
function TestCommandProperties (line 11) | func TestCommandProperties(t *testing.T) {
function TestCommandNil (line 19) | func TestCommandNil(t *testing.T) {
function TestExecution (line 26) | func TestExecution(t *testing.T) {
FILE: internal/cli/serve/command_windows.go
function log (line 22) | func log(msg string, silent bool) {
function NewCommand (line 28) | func NewCommand(override *[]string, cfgFile *string, silent *bool, exper...
FILE: internal/cli/stop/command.go
constant pidFileName (line 17) | pidFileName string = ".pid"
function NewCommand (line 21) | func NewCommand(silent *bool, force *bool) *cobra.Command {
FILE: internal/cli/stop/command_test.go
function TestCommandProperties (line 11) | func TestCommandProperties(t *testing.T) {
function TestCommandTrue (line 18) | func TestCommandTrue(t *testing.T) {
function toPtr (line 25) | func toPtr[T any](val T) *T {
FILE: internal/cli/workers/command.go
function NewCommand (line 22) | func NewCommand(cfgFile *string, override *[]string) *cobra.Command { //...
function showWorkers (line 92) | func showWorkers(plugins []string, client *rpc.Client) {
FILE: internal/cli/workers/command_test.go
function TestCommandProperties (line 11) | func TestCommandProperties(t *testing.T) {
function TestCommandFlags (line 18) | func TestCommandFlags(t *testing.T) {
function TestExecution (line 45) | func TestExecution(t *testing.T) {
FILE: internal/cli/workers/render.go
constant Ready (line 18) | Ready string = "READY"
constant Paused (line 19) | Paused string = "PAUSED/STOPPED"
function WorkerTable (line 23) | func WorkerTable(writer io.Writer, workers []*process.State, err error) ...
function ServiceWorkerTable (line 72) | func ServiceWorkerTable(writer io.Writer, workers []*process.State) *tab...
function JobsTable (line 106) | func JobsTable(writer io.Writer, jobs []*jobs.State, err error) *tablewr...
function renderReady (line 157) | func renderReady(ready bool) string {
function renderCPU (line 166) | func renderCPU(cpu float64) string {
function renderStatus (line 170) | func renderStatus(status string) string {
function renderJobs (line 189) | func renderJobs(number uint64) string {
function renderAlive (line 193) | func renderAlive(t time.Time) string {
FILE: internal/debug/server.go
type Server (line 11) | type Server struct
method Start (line 32) | func (s *Server) Start(addr string) error {
method Stop (line 39) | func (s *Server) Stop(ctx context.Context) error {
function NewServer (line 16) | func NewServer() Server {
FILE: internal/debug/server_test.go
function TestServer_StartingAndStopping (line 17) | func TestServer_StartingAndStopping(t *testing.T) {
FILE: internal/meta/meta.go
function Version (line 12) | func Version() string {
function BuildTime (line 23) | func BuildTime() string { return buildTime }
FILE: internal/meta/meta_test.go
function TestVersion (line 9) | func TestVersion(t *testing.T) {
function TestBuildTime (line 40) | func TestBuildTime(t *testing.T) {
FILE: internal/rpc/client.go
constant rpcKey (line 17) | rpcKey string = "rpc.listen"
constant envDefault (line 19) | envDefault = ":-"
function NewClient (line 24) | func NewClient(cfg string, flags []string) (*rpc.Client, error) {
function Dialer (line 74) | func Dialer(addr string) (net.Conn, error) {
function parseFlag (line 83) | func parseFlag(flag string) (string, string, error) {
function parseValue (line 104) | func parseValue(value string) string {
function ExpandVal (line 117) | func ExpandVal(s string, mapping func(string) string) string {
function getShellName (line 168) | func getShellName(s string) (string, int) {
function expandEnvViper (line 195) | func expandEnvViper(v *viper.Viper) {
function isShellSpecialVar (line 226) | func isShellSpecialVar(c uint8) bool {
function isAlphaNum (line 235) | func isAlphaNum(c uint8) bool {
function parseEnvDefault (line 239) | func parseEnvDefault(val string) string {
FILE: internal/rpc/client_test.go
function TestNewClient_RpcServiceDisabled (line 15) | func TestNewClient_RpcServiceDisabled(t *testing.T) {
function TestNewClient_WrongRcpConfiguration (line 25) | func TestNewClient_WrongRcpConfiguration(t *testing.T) {
function TestNewClient_ConnectionError (line 33) | func TestNewClient_ConnectionError(t *testing.T) {
function TestNewClient_SuccessfullyConnected (line 41) | func TestNewClient_SuccessfullyConnected(t *testing.T) {
function TestNewClient_WithIncludes (line 55) | func TestNewClient_WithIncludes(t *testing.T) {
function TestNewClient_SuccessfullyConnectedOverride (line 69) | func TestNewClient_SuccessfullyConnectedOverride(t *testing.T) {
function TestNewClient_SuccessfullyConnectedEnvDollarSyntax (line 84) | func TestNewClient_SuccessfullyConnectedEnvDollarSyntax(t *testing.T) {
FILE: internal/rpc/includes.go
constant versionKey (line 9) | versionKey string = "version"
constant includeKey (line 10) | includeKey string = "include"
constant defaultConfigVersion (line 11) | defaultConfigVersion string = "3"
constant prevConfigVersion (line 12) | prevConfigVersion string = "2.7"
function getConfiguration (line 15) | func getConfiguration(path string) (map[string]any, string, error) {
function handleInclude (line 39) | func handleInclude(rootVersion string, v *viper.Viper) error {
FILE: internal/sdnotify/sdnotify.go
type State (line 26) | type State
constant Ready (line 32) | Ready State = "READY=1"
constant Stopping (line 36) | Stopping State = "STOPPING=1"
constant Reloading (line 41) | Reloading State = "RELOADING=1"
constant Watchdog (line 45) | Watchdog = "WATCHDOG=1"
function SdNotify (line 56) | func SdNotify(state State) (bool, error) {
function StartWatchdog (line 84) | func StartWatchdog(interval int, stopCh <-chan struct{}) {
FILE: lib/roadrunner.go
constant rrModule (line 13) | rrModule string = "github.com/roadrunner-server/roadrunner/v2025"
type RR (line 16) | type RR struct
method Serve (line 74) | func (rr *RR) Serve() error {
method Plugins (line 89) | func (rr *RR) Plugins() []string {
method Stop (line 94) | func (rr *RR) Stop() {
function NewRR (line 23) | func NewRR(cfgFile string, override []string, pluginList []any) (*RR, er...
function DefaultPluginsList (line 99) | func DefaultPluginsList() []any {
function getRRVersion (line 105) | func getRRVersion() string {
FILE: lib/roadrunner_test.go
function TestNewFailsOnMissingConfig (line 14) | func TestNewFailsOnMissingConfig(t *testing.T) {
constant testConfigWithVersion (line 19) | testConfigWithVersion = `
constant testConfig (line 29) | testConfig = `
function makeConfig (line 38) | func makeConfig(t *testing.T, configYaml string) string {
function TestNewWithOldConfig (line 46) | func TestNewWithOldConfig(t *testing.T) {
function TestNewWithConfig (line 56) | func TestNewWithConfig(t *testing.T) {
function TestServeStop (line 67) | func TestServeStop(t *testing.T) {
FILE: schemas/test.js
function stripIds (line 6) | function stripIds(schema, first) {
FILE: tests/e2e_grpc_test.go
function TestGrpcPing (line 34) | func TestGrpcPing(t *testing.T) {
function TestGrpcPingWithOtel (line 127) | func TestGrpcPingWithOtel(t *testing.T) {
FILE: tests/e2e_http_test.go
function newHTTPClient (line 37) | func newHTTPClient() *http.Client {
function TestHTTPWithMiddleware (line 44) | func TestHTTPWithMiddleware(t *testing.T) {
function TestHTTPStaticFile (line 150) | func TestHTTPStaticFile(t *testing.T) {
function TestHTTPWithOtel (line 258) | func TestHTTPWithOtel(t *testing.T) {
FILE: tests/e2e_jobs_test.go
function TestJobsInMemory (line 34) | func TestJobsInMemory(t *testing.T) {
function TestJobsInMemoryWithOtel (line 123) | func TestJobsInMemoryWithOtel(t *testing.T) {
FILE: tests/helpers/helpers.go
constant push (line 17) | push = "jobs.Push"
constant pause (line 18) | pause = "jobs.Pause"
constant destroy (line 19) | destroy = "jobs.Destroy"
constant resume (line 20) | resume = "jobs.Resume"
constant dialTimeout (line 22) | dialTimeout = 5 * time.Second
function rpcClient (line 27) | func rpcClient(t *testing.T, address string) *rpc.Client {
function callPipelines (line 44) | func callPipelines(t *testing.T, address, method string, pipes []string) {
function ResumePipes (line 60) | func ResumePipes(address string, pipes ...string) func(t *testing.T) {
function PausePipelines (line 68) | func PausePipelines(address string, pipes ...string) func(t *testing.T) {
function PushToPipe (line 76) | func PushToPipe(pipeline string, autoAck bool, address string) func(t *t...
function DestroyPipelines (line 102) | func DestroyPipelines(address string, pipes ...string) func(t *testing.T) {
FILE: tests/mock/logger.go
type Logger (line 10) | type Logger interface
type ZapLoggerMock (line 16) | type ZapLoggerMock struct
method Init (line 31) | func (z *ZapLoggerMock) Init() error {
method Serve (line 35) | func (z *ZapLoggerMock) Serve() chan error {
method Stop (line 39) | func (z *ZapLoggerMock) Stop() error {
method Provides (line 43) | func (z *ZapLoggerMock) Provides() []*dep.Out {
method Weight (line 49) | func (z *ZapLoggerMock) Weight() uint {
method ProvideLogger (line 54) | func (z *ZapLoggerMock) ProvideLogger() *Log {
function ZapTestLogger (line 22) | func ZapTestLogger(enab zapcore.LevelEnabler) (*ZapLoggerMock, *Observed...
type Log (line 59) | type Log struct
method NamedLogger (line 71) | func (l *Log) NamedLogger(name string) *zap.Logger {
function NewLog (line 64) | func NewLog(log *zap.Logger) *Log {
FILE: tests/mock/observer.go
type LoggedEntry (line 32) | type LoggedEntry struct
method ContextMap (line 38) | func (e LoggedEntry) ContextMap() map[string]any {
type ObservedLogs (line 47) | type ObservedLogs struct
method Len (line 53) | func (o *ObservedLogs) Len() int {
method All (line 61) | func (o *ObservedLogs) All() []LoggedEntry {
method TakeAll (line 71) | func (o *ObservedLogs) TakeAll() []LoggedEntry {
method AllUntimed (line 81) | func (o *ObservedLogs) AllUntimed() []LoggedEntry {
method FilterLevelExact (line 90) | func (o *ObservedLogs) FilterLevelExact(level zapcore.Level) *Observed...
method FilterMessage (line 97) | func (o *ObservedLogs) FilterMessage(msg string) *ObservedLogs {
method FilterMessageSnippet (line 105) | func (o *ObservedLogs) FilterMessageSnippet(snippet string) *ObservedL...
method FilterField (line 112) | func (o *ObservedLogs) FilterField(field zapcore.Field) *ObservedLogs {
method FilterFieldKey (line 124) | func (o *ObservedLogs) FilterFieldKey(key string) *ObservedLogs {
method Filter (line 137) | func (o *ObservedLogs) Filter(keep func(LoggedEntry) bool) *ObservedLo...
method add (line 150) | func (o *ObservedLogs) add(log LoggedEntry) {
function New (line 157) | func New(enab zapcore.LevelEnabler) (zapcore.Core, *ObservedLogs) {
type contextObserver (line 165) | type contextObserver struct
method Check (line 171) | func (co *contextObserver) Check(ent zapcore.Entry, ce *zapcore.Checke...
method With (line 178) | func (co *contextObserver) With(fields []zapcore.Field) zapcore.Core {
method Write (line 186) | func (co *contextObserver) Write(ent zapcore.Entry, fields []zapcore.F...
method Sync (line 195) | func (co *contextObserver) Sync() error {
FILE: tests/php_test_files/grpc/src/EchoService.php
class EchoService (line 10) | class EchoService implements EchoInterface
method Ping (line 12) | public function Ping(ContextInterface $ctx, Message $in): Message
FILE: tests/php_test_files/grpc/src/Health/HealthCheckRequest.php
class HealthCheckRequest (line 14) | class HealthCheckRequest extends \Google\Protobuf\Internal\Message
method __construct (line 30) | public function __construct($data = NULL) {
method getService (line 39) | public function getService()
method setService (line 49) | public function setService($var)
FILE: tests/php_test_files/grpc/src/Health/HealthCheckResponse.php
class HealthCheckResponse (line 14) | class HealthCheckResponse extends \Google\Protobuf\Internal\Message
method __construct (line 30) | public function __construct($data = NULL) {
method getStatus (line 39) | public function getStatus()
method setStatus (line 49) | public function setStatus($var)
FILE: tests/php_test_files/grpc/src/Health/HealthCheckResponse/ServingStatus.php
class ServingStatus (line 12) | class ServingStatus
method name (line 40) | public static function name($value)
method value (line 50) | public static function value($name)
FILE: tests/php_test_files/grpc/src/Health/HealthInterface.php
type HealthInterface (line 9) | interface HealthInterface extends GRPC\ServiceInterface
method Check (line 21) | public function Check(GRPC\ContextInterface $ctx, HealthCheckRequest $...
method Watch (line 30) | public function Watch(GRPC\ContextInterface $ctx, HealthCheckRequest $...
FILE: tests/php_test_files/grpc/src/HealthService.php
class HealthService (line 11) | class HealthService implements HealthInterface
method Check (line 13) | public function Check(ContextInterface $ctx, HealthCheckRequest $in): ...
method Watch (line 20) | public function Watch(ContextInterface $ctx, HealthCheckRequest $in): ...
FILE: tests/php_test_files/grpc/src/Service/EchoInterface.php
type EchoInterface (line 9) | interface EchoInterface extends GRPC\ServiceInterface
method Ping (line 21) | public function Ping(GRPC\ContextInterface $ctx, Message $in): Message;
FILE: tests/php_test_files/grpc/src/Service/Message.php
class Message (line 14) | class Message extends \Google\Protobuf\Internal\Message
method __construct (line 30) | public function __construct($data = NULL) {
method getMsg (line 39) | public function getMsg()
method setMsg (line 49) | public function setMsg($var)
FILE: tests/php_test_files/http/echo.php
function handleRequest (line 10) | function handleRequest(ServerRequestInterface $req, ResponseInterface $r...
FILE: tests/proto/service/service.pb.go
constant _ (line 19) | _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
constant _ (line 21) | _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
type Message (line 24) | type Message struct
method Reset (line 32) | func (x *Message) Reset() {
method String (line 41) | func (x *Message) String() string {
method ProtoMessage (line 45) | func (*Message) ProtoMessage() {}
method ProtoReflect (line 47) | func (x *Message) ProtoReflect() protoreflect.Message {
method Descriptor (line 60) | func (*Message) Descriptor() ([]byte, []int) {
method GetMsg (line 64) | func (x *Message) GetMsg() string {
function file_service_proto_rawDescGZIP (line 90) | func file_service_proto_rawDescGZIP() []byte {
function init (line 111) | func init() { file_service_proto_init() }
function file_service_proto_init (line 112) | func file_service_proto_init() {
FILE: tests/proto/service/service_grpc.pb.go
constant _ (line 20) | _ = grpc.SupportPackageIsVersion7
type EchoClient (line 25) | type EchoClient interface
type echoClient (line 29) | type echoClient struct
method Ping (line 37) | func (c *echoClient) Ping(ctx context.Context, in *Message, opts ...gr...
function NewEchoClient (line 33) | func NewEchoClient(cc grpc.ClientConnInterface) EchoClient {
type EchoServer (line 49) | type EchoServer interface
type UnimplementedEchoServer (line 55) | type UnimplementedEchoServer struct
method Ping (line 58) | func (UnimplementedEchoServer) Ping(context.Context, *Message) (*Messa...
method mustEmbedUnimplementedEchoServer (line 61) | func (UnimplementedEchoServer) mustEmbedUnimplementedEchoServer() {}
type UnsafeEchoServer (line 66) | type UnsafeEchoServer interface
function RegisterEchoServer (line 70) | func RegisterEchoServer(s grpc.ServiceRegistrar, srv EchoServer) {
function _Echo_Ping_Handler (line 74) | func _Echo_Ping_Handler(srv interface{}, ctx context.Context, dec func(i...
Condensed preview — 146 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (704K chars).
[
{
"path": ".claude/settings.json",
"chars": 297,
"preview": "{\n \"hooks\": {\n \"Stop\": [\n {\n \"hooks\": [\n {\n \"type\": \"command\",\n \"command\""
},
{
"path": ".dockerignore",
"chars": 173,
"preview": ".dockerignore\n.git\n.gitignore\n.editorconfig\n.github\n/src\n/tests\n/bin\ncomposer.json\nvendor_php\nMakefile\nCHANGELOG.md\nLICE"
},
{
"path": ".editorconfig",
"chars": 230,
"preview": "root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\nindent_style = tab\nindent_size = 4\ntrim_tr"
},
{
"path": ".githooks/pre-commit",
"chars": 272,
"preview": "#!/bin/bash\n\nset -e -o pipefail\n\n# https://github.com/koalaman/shellcheck/wiki/SC2039#redirect-both-stdout-and-stderr\nif"
},
{
"path": ".github/CODEOWNERS",
"chars": 38,
"preview": "# Primary owners\n\n@wolfy-j @rustatian\n"
},
{
"path": ".github/FUNDING.yml",
"chars": 73,
"preview": "# These are supported funding model platforms\n\ngithub: roadrunner-server\n"
},
{
"path": ".github/ISSUE_TEMPLATE/bug-report.yml",
"chars": 1430,
"preview": "name: Bug Report\ndescription: 🐛 File a bug report\ntitle: \"[🐛 BUG]: \"\nlabels: [\"B-bug\", \"F-need-verification\"]\nassignees:"
},
{
"path": ".github/ISSUE_TEMPLATE/chore.yml",
"chars": 691,
"preview": "name: Chore\ndescription: 🧹 Enhancement or chore of the existing code\ntitle: \"[🧹 CHORE]: \"\nlabels: [\"C-enhancement\"]\nassi"
},
{
"path": ".github/ISSUE_TEMPLATE/config.yml",
"chars": 212,
"preview": "blank_issues_enabled: false\n\ncontact_links:\n - name: ❓ Start a discussion or ask a question.\n url: https://github.co"
},
{
"path": ".github/ISSUE_TEMPLATE/feature-request.yml",
"chars": 975,
"preview": "name: Feature request\ndescription: 💡 Suggest an idea for this project\ntitle: \"[💡 FEATURE REQUEST]: \"\nlabels: [\"C-feature"
},
{
"path": ".github/dependabot.yml",
"chars": 893,
"preview": "# To get started with Dependabot version updates, you'll need to specify which\n# package ecosystems to update and where "
},
{
"path": ".github/pull_request_template.md",
"chars": 803,
"preview": "# Reason for This PR\n\n`[Author TODO: add issue # or explain reasoning.]`\n\n## Description of Changes\n\n`[Author TODO: add "
},
{
"path": ".github/workflows/codeql-analysis.yml",
"chars": 1309,
"preview": "# For most projects, this workflow file will not need changing; you simply need to commit it to your repository.\n#\n# You"
},
{
"path": ".github/workflows/dependency-review.yml",
"chars": 883,
"preview": "# Dependency Review Action\n#\n# This Action will scan dependency manifest files that change as part of a Pull Request, su"
},
{
"path": ".github/workflows/e2e.yml",
"chars": 1787,
"preview": "name: e2e_tests\non:\n push:\n branches:\n - master\n - stable\n pull_request:\n branches:\n - master\n "
},
{
"path": ".github/workflows/release.yml",
"chars": 7042,
"preview": "name: release\non:\n release: # Docs: <https://help.github.com/en/articles/events-that-trigger-workflows#release-event-re"
},
{
"path": ".github/workflows/release_dep.yml",
"chars": 4338,
"preview": "name: release_dep\non:\n release: # Docs: <https://help.github.com/en/articles/events-that-trigger-workflows#release-even"
},
{
"path": ".github/workflows/release_dep_aarch64.yml",
"chars": 4344,
"preview": "name: release_dep_arm64\non:\n release: # Docs: <https://help.github.com/en/articles/events-that-trigger-workflows#releas"
},
{
"path": ".github/workflows/release_grpc.yml",
"chars": 4872,
"preview": "name: release_grpc\non:\n release: # Docs: <https://help.github.com/en/articles/events-that-trigger-workflows#release-eve"
},
{
"path": ".github/workflows/semgrep.yml",
"chars": 388,
"preview": "name: semgrep\non:\n pull_request: {}\n push:\n branches:\n - master\n - stable\n paths:\n - .github/work"
},
{
"path": ".github/workflows/tests.yml",
"chars": 3975,
"preview": "name: rr_cli_tests\non:\n push:\n branches:\n - master\n - stable\n pull_request:\njobs:\n golangci-lint:\n na"
},
{
"path": ".gitignore",
"chars": 443,
"preview": "# Created by .ignore support plugin (hsz.mobi)\n### Go template\n# Binaries for programs and plugins\n*.exe\n*.exe~\n*.dll\n*."
},
{
"path": ".golangci.yml",
"chars": 1671,
"preview": "version: \"2\"\nrun:\n allow-parallel-runners: true\noutput:\n formats:\n text:\n path: stdout\nlinters:\n default: non"
},
{
"path": ".rr.yaml",
"chars": 65635,
"preview": "######################################################################################\n# THIS IS S"
},
{
"path": ".vscode/launch.json",
"chars": 936,
"preview": "{\n\t// Use IntelliSense to learn about possible attributes.\n\t// Hover to view descriptions of existing attributes.\n\t// Fo"
},
{
"path": "CHANGELOG.md",
"chars": 73,
"preview": "# CHANGELOG\n\nreleases: [docs](https://docs.roadrunner.dev/docs/releases)\n"
},
{
"path": "CLAUDE.md",
"chars": 4852,
"preview": "# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## "
},
{
"path": "CODE_OF_CONDUCT.md",
"chars": 3220,
"preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, w"
},
{
"path": "CONTRIBUTING.md",
"chars": 2417,
"preview": "# Welcome to RoadRunner docs contributing guide <!-- omit in toc -->\n\nThank you for investing your time in contributing "
},
{
"path": "Dockerfile",
"chars": 2042,
"preview": "# Image page: <https://hub.docker.com/_/golang>\nFROM --platform=${TARGETPLATFORM:-linux/amd64} golang:1.26-alpine AS bui"
},
{
"path": "LICENSE",
"chars": 1069,
"preview": "MIT License\n\nCopyright (c) 2020 Spiral Scout\n\nPermission is hereby granted, free of charge, to any person obtaining a co"
},
{
"path": "Makefile",
"chars": 180,
"preview": "test:\n\tgo test -v -race ./...\n\nbuild:\n\tCGO_ENABLED=0 go build -trimpath -ldflags \"-s\" -o rr cmd/rr/main.go\n\ndebug:\n\tdlv "
},
{
"path": "README.md",
"chars": 7644,
"preview": "<a href=\"https://roadrunner.dev\" target=\"_blank\">\n <picture>\n <source media=\"(prefers-color-scheme: dark)\" srcset=\"h"
},
{
"path": "SECURITY.md",
"chars": 192,
"preview": "# Security Policy\n\n## Supported Versions\n\n| Version | Supported |\n|----------|-----------|\n| 2.x | No |\n| 2"
},
{
"path": "benchmarks/simple.js",
"chars": 2223,
"preview": "import http from 'k6/http';\nimport { sleep } from 'k6';\n\nexport const options = {\n // A number specifying the number of"
},
{
"path": "cmd/rr/command_test.go",
"chars": 1365,
"preview": "package main\n\nimport (\n\t\"bytes\"\n\t\"io\"\n\t\"os\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc Test_Main("
},
{
"path": "cmd/rr/doc.go",
"chars": 84,
"preview": "// Package main is the entry point for the RoadRunner CLI application.\npackage main\n"
},
{
"path": "cmd/rr/main.go",
"chars": 548,
"preview": "package main\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\n\t\"github.com/fatih/color\"\n\t\"github.com/roadrunner-server/roadrunner/v2025"
},
{
"path": "codecov.yml",
"chars": 216,
"preview": "coverage:\n status:\n project:\n default:\n target: auto\n threshold: 0%\n informational: true\n "
},
{
"path": "composer.json",
"chars": 1004,
"preview": "{\n \"name\": \"spiral/roadrunner\",\n \"type\": \"metapackage\",\n \"description\": \"RoadRunner: High-performance PHP appli"
},
{
"path": "container/config.go",
"chars": 1380,
"preview": "package container\n\nimport (\n\t\"fmt\"\n\t\"log/slog\"\n\t\"time\"\n\n\t\"github.com/spf13/viper\"\n)\n\n// Config defines endure container "
},
{
"path": "container/config_test.go",
"chars": 2150,
"preview": "package container_test\n\nimport (\n\t\"log/slog\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/roadrunner-server/config/v5\"\n\t\"github.com/"
},
{
"path": "container/container_test.go",
"chars": 483,
"preview": "package container_test\n\nimport (\n\t\"log/slog\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/roadrunner-server/endure/v2\"\n\t\"github.com/"
},
{
"path": "container/doc.go",
"chars": 166,
"preview": "// Package container provides Endure dependency injection container configuration\n// and plugin registration for the Roa"
},
{
"path": "container/plugins.go",
"chars": 3040,
"preview": "package container\n\nimport (\n\t\"github.com/roadrunner-server/amqp/v5\"\n\tappLogger \"github.com/roadrunner-server/app-logger/"
},
{
"path": "container/plugins_test.go",
"chars": 339,
"preview": "package container\n\nimport (\n\t\"reflect\"\n\t\"testing\"\n)\n\nfunc TestPlugins(t *testing.T) {\n\tfor _, p := range Plugins() {\n\t\ti"
},
{
"path": "container/test/endure_ok.yaml",
"chars": 88,
"preview": "endure:\n grace_period: 10s\n print_graph: true\n retry_on_fail: true\n log_level: warn\n"
},
{
"path": "container/test/endure_ok_debug.yaml",
"chars": 89,
"preview": "endure:\n grace_period: 10s\n print_graph: true\n retry_on_fail: true\n log_level: debug\n"
},
{
"path": "container/test/endure_ok_error.yaml",
"chars": 89,
"preview": "endure:\n grace_period: 10s\n print_graph: true\n retry_on_fail: true\n log_level: error\n"
},
{
"path": "container/test/endure_ok_foobar.yaml",
"chars": 90,
"preview": "endure:\n grace_period: 10s\n print_graph: true\n retry_on_fail: true\n log_level: foobar\n"
},
{
"path": "container/test/endure_ok_info.yaml",
"chars": 88,
"preview": "endure:\n grace_period: 10s\n print_graph: true\n retry_on_fail: true\n log_level: info\n"
},
{
"path": "container/test/endure_ok_warn.yaml",
"chars": 88,
"preview": "endure:\n grace_period: 10s\n print_graph: true\n retry_on_fail: true\n log_level: warn\n"
},
{
"path": "container/test/without_endure_ok.yaml",
"chars": 0,
"preview": ""
},
{
"path": "download-latest.sh",
"chars": 4286,
"preview": "#!/bin/sh\n\n# This script can optionally use a GitHub token to increase your request limit (for example, if using this sc"
},
{
"path": "githooks-installer.sh",
"chars": 79,
"preview": "#!/bin/sh\n\nset -e\n\ncp ./.githooks/pre-commit .git/hooks/pre-commit\n\necho \"DONE\""
},
{
"path": "go.mod",
"chars": 11143,
"preview": "module github.com/roadrunner-server/roadrunner/v2025\n\ngo 1.26.1\n\nrequire (\n\tgithub.com/buger/goterm v1.0.4\n\tgithub.com/d"
},
{
"path": "go.sum",
"chars": 72549,
"preview": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1"
},
{
"path": "go.work",
"chars": 31,
"preview": "go 1.26.1\n\nuse (\n\t.\n\t./tests\n)\n"
},
{
"path": "go.work.sum",
"chars": 34756,
"preview": "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.6-20250425153114-8976f5be98c1.1/go.mod h1:avRlCjnFzl98V"
},
{
"path": "internal/cli/doc.go",
"chars": 207,
"preview": "// Package cli implements the root Cobra command for the RoadRunner CLI,\n// including persistent flags, environment vari"
},
{
"path": "internal/cli/jobs/command.go",
"chars": 2183,
"preview": "package jobs\n\nimport (\n\t\"strings\"\n\n\tinternalRpc \"github.com/roadrunner-server/roadrunner/v2025/internal/rpc\"\n\n\t\"github.c"
},
{
"path": "internal/cli/jobs/command_test.go",
"chars": 320,
"preview": "package jobs_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/roadrunner-server/roadrunner/v2025/internal/cli/jobs\"\n\t\"github.com/"
},
{
"path": "internal/cli/jobs/doc.go",
"chars": 154,
"preview": "// Package jobs implements the \"jobs\" command for managing job pipelines,\n// supporting pause, resume, destroy, and list"
},
{
"path": "internal/cli/jobs/render.go",
"chars": 695,
"preview": "package jobs\n\nimport (\n\t\"io\"\n\n\t\"github.com/olekukonko/tablewriter\"\n\t\"github.com/olekukonko/tablewriter/tw\"\n)\n\n// JobsCom"
},
{
"path": "internal/cli/jobs/subcommands.go",
"chars": 1271,
"preview": "package jobs\n\nimport (\n\t\"net/rpc\"\n\t\"os\"\n\n\tjobsv1 \"github.com/roadrunner-server/api/v4/build/jobs/v1\"\n)\n\nfunc pause(clien"
},
{
"path": "internal/cli/reset/command.go",
"chars": 1743,
"preview": "package reset\n\nimport (\n\t\"log\"\n\t\"sync\"\n\n\tinternalRpc \"github.com/roadrunner-server/roadrunner/v2025/internal/rpc\"\n\t\"gith"
},
{
"path": "internal/cli/reset/command_test.go",
"chars": 325,
"preview": "package reset_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/roadrunner-server/roadrunner/v2025/internal/cli/reset\"\n\n\t\"github.c"
},
{
"path": "internal/cli/reset/doc.go",
"chars": 145,
"preview": "// Package reset implements the \"reset\" command that resets workers of all\n// or specific RoadRunner plugins concurrentl"
},
{
"path": "internal/cli/root.go",
"chars": 4819,
"preview": "package cli\n\nimport (\n\t\"context\"\n\tstderr \"errors\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"os\"\n\t\"os/signal\"\n\t\"path/filepath\"\n\t\"runtime\"\n\t\"st"
},
{
"path": "internal/cli/root_test.go",
"chars": 3760,
"preview": "package cli_test\n\nimport (\n\t\"os\"\n\t\"path\"\n\t\"testing\"\n\n\t\"github.com/roadrunner-server/roadrunner/v2025/internal/cli\"\n\t\"git"
},
{
"path": "internal/cli/serve/command.go",
"chars": 4885,
"preview": "//go:build !windows\n\npackage serve\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"os/signal\"\n\t\"syscall\"\n\n\t\"github.com/roadrunner-server/endure"
},
{
"path": "internal/cli/serve/command_test.go",
"chars": 557,
"preview": "package serve_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/roadrunner-server/roadrunner/v2025/internal/cli/serve\"\n\n\t\"github.c"
},
{
"path": "internal/cli/serve/command_windows.go",
"chars": 4003,
"preview": "//go:build windows\n\npackage serve\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"os/signal\"\n\t\"syscall\"\n\n\t\"github.com/roadrunner-server/endure/"
},
{
"path": "internal/cli/serve/doc.go",
"chars": 239,
"preview": "// Package serve implements the \"serve\" command that starts the RoadRunner\n// server, manages the Endure container lifec"
},
{
"path": "internal/cli/stop/command.go",
"chars": 1342,
"preview": "package stop\n\nimport (\n\t\"log\"\n\t\"os\"\n\t\"strconv\"\n\t\"syscall\"\n\t\"time\"\n\n\t\"github.com/roadrunner-server/errors\"\n\t\"github.com/r"
},
{
"path": "internal/cli/stop/command_test.go",
"chars": 508,
"preview": "package stop_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/roadrunner-server/roadrunner/v2025/internal/cli/stop\"\n\n\t\"github.com"
},
{
"path": "internal/cli/stop/doc.go",
"chars": 172,
"preview": "// Package stop implements the \"stop\" command that gracefully stops the\n// RoadRunner server by sending SIGTERM to the p"
},
{
"path": "internal/cli/workers/command.go",
"chars": 3523,
"preview": "package workers\n\nimport (\n\t\"fmt\"\n\t\"net/rpc\"\n\t\"os\"\n\t\"os/signal\"\n\t\"syscall\"\n\t\"time\"\n\n\t\"github.com/roadrunner-server/api/v4"
},
{
"path": "internal/cli/workers/command_test.go",
"chars": 972,
"preview": "package workers_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/roadrunner-server/roadrunner/v2025/internal/cli/workers\"\n\n\t\"gith"
},
{
"path": "internal/cli/workers/doc.go",
"chars": 207,
"preview": "// Package workers implements the \"workers\" command that displays information\n// about active RoadRunner workers and job"
},
{
"path": "internal/cli/workers/render.go",
"chars": 4166,
"preview": "package workers\n\nimport (\n\t\"io\"\n\t\"sort\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com/dustin/go-humanize\"\n\t\"github.com/fatih/color\"\n\t"
},
{
"path": "internal/debug/doc.go",
"chars": 118,
"preview": "// Package debug provides an HTTP server with pprof endpoints for runtime\n// profiling and diagnostics.\npackage debug\n"
},
{
"path": "internal/debug/server.go",
"chars": 857,
"preview": "package debug\n\nimport (\n\t\"context\"\n\t\"net/http\"\n\t\"net/http/pprof\"\n\t\"time\"\n)\n\n// Server is a HTTP server for debugging.\nty"
},
{
"path": "internal/debug/server_test.go",
"chars": 1383,
"preview": "package debug_test\n\nimport (\n\t\"context\"\n\t\"math/rand\"\n\t\"net\"\n\t\"net/http\"\n\t\"strconv\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/road"
},
{
"path": "internal/meta/doc.go",
"chars": 127,
"preview": "// Package meta holds build-time version and build timestamp metadata\n// set via linker flags during compilation.\npackag"
},
{
"path": "internal/meta/meta.go",
"chars": 507,
"preview": "package meta\n\nimport \"strings\"\n\n// next variables will be set during compilation (do NOT rename them).\nvar (\n\tversion "
},
{
"path": "internal/meta/meta_test.go",
"chars": 871,
"preview": "package meta\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestVersion(t *testing.T) {\n\tfor give, "
},
{
"path": "internal/rpc/client.go",
"chars": 6018,
"preview": "package rpc\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"net\"\n\t\"net/rpc\"\n\t\"os\"\n\t\"strings\"\n\n\tgoridgeRpc \"github.com/roadrunner-server/gor"
},
{
"path": "internal/rpc/client_test.go",
"chars": 2546,
"preview": "package rpc_test\n\nimport (\n\t\"net\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/roadrunner-server/config/v5\"\n\t\"github.com/roadrunner-se"
},
{
"path": "internal/rpc/doc.go",
"chars": 354,
"preview": "// Package rpc provides an internal RPC client for CLI-to-server communication.\n// It handles configuration loading with"
},
{
"path": "internal/rpc/includes.go",
"chars": 1424,
"preview": "package rpc\n\nimport (\n\t\"github.com/roadrunner-server/errors\"\n\t\"github.com/spf13/viper\"\n)\n\nconst (\n\tversionKey "
},
{
"path": "internal/rpc/test/config_rpc_conn_err.yaml",
"chars": 51,
"preview": "version: \"3\"\n\nrpc:\n listen: tcp://127.0.0.1:55554\n"
},
{
"path": "internal/rpc/test/config_rpc_empty.yaml",
"chars": 13,
"preview": "version: \"3\"\n"
},
{
"path": "internal/rpc/test/config_rpc_ok.yaml",
"chars": 51,
"preview": "version: \"3\"\n\nrpc:\n listen: tcp://127.0.0.1:55554\n"
},
{
"path": "internal/rpc/test/config_rpc_ok_env.yaml",
"chars": 36,
"preview": "version: \"3\"\n\nrpc:\n listen: ${RPC}\n"
},
{
"path": "internal/rpc/test/config_rpc_wrong.yaml",
"chars": 30,
"preview": "version: \"3\"\n\nrpc:\n $foo bar\n"
},
{
"path": "internal/rpc/test/include1/.rr-include.yaml",
"chars": 51,
"preview": "version: \"3\"\n\nrpc:\n listen: tcp://127.0.0.1:6010\n\n"
},
{
"path": "internal/rpc/test/include1/.rr.yaml",
"chars": 162,
"preview": "version: \"3\"\n\nserver:\n command: \"php app-with-domain-specific-routes.php\"\n\nlogs:\n level: debug\n mode: development\n\nin"
},
{
"path": "internal/sdnotify/doc.go",
"chars": 289,
"preview": "// Package sdnotify provides a Go implementation of the sd_notify protocol.\n// It can be used to inform systemd of servi"
},
{
"path": "internal/sdnotify/sdnotify.go",
"chars": 2884,
"preview": "// Copyright 2014 Docker, Inc.\n// Copyright 2015-2018 CoreOS, Inc.\n// Copyright 2025 SpiralScout.\n//\n// Licensed under t"
},
{
"path": "lib/doc.go",
"chars": 230,
"preview": "// Package lib provides a public API for embedding RoadRunner as a library.\n// It exposes the RR type for programmatic c"
},
{
"path": "lib/roadrunner.go",
"chars": 2567,
"preview": "package lib\n\nimport (\n\t\"fmt\"\n\t\"runtime/debug\"\n\n\tconfigImpl \"github.com/roadrunner-server/config/v5\"\n\t\"github.com/roadrun"
},
{
"path": "lib/roadrunner_test.go",
"chars": 1862,
"preview": "package lib_test\n\nimport (\n\t\"os\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/roadrunner-server/informer/v5\"\n\t\"github.com/roadrunner"
},
{
"path": "schemas/config/1.0.schema.json",
"chars": 6079,
"preview": "{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"description\": \"Version 1.0 is deprecated. Please, upgrade R"
},
{
"path": "schemas/config/2.0.schema.json",
"chars": 116799,
"preview": "{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"title\": \"Spiral Roadrunner config file schema version 2"
},
{
"path": "schemas/config/3.0.schema.json",
"chars": 125103,
"preview": "{\n \"$id\": \"https://raw.githubusercontent.com/roadrunner-server/roadrunner/refs/heads/master/schemas/config/3.0.schema.j"
},
{
"path": "schemas/package.json",
"chars": 324,
"preview": "{\n\t\"name\": \"roadrunner-schema-tests\",\n\t\"version\": \"1.0.0\",\n\t\"main\": \"test.js\",\n\t\"type\": \"module\",\n\t\"scripts\": {\n\t\t\"test\""
},
{
"path": "schemas/readme.md",
"chars": 394,
"preview": "# Schemas\n\nThis directory contains public schemas for the most important parts of application.\n\n**Do not rename or remov"
},
{
"path": "schemas/test.js",
"chars": 1164,
"preview": "import $RefParser from \"@apidevtools/json-schema-ref-parser\";\nimport Ajv2019 from \"ajv/dist/2019.js\"\nimport fs from 'fs'"
},
{
"path": "tests/configs/.rr-grpc-otel.yaml",
"chars": 561,
"preview": "version: '3'\n\nrpc:\n listen: tcp://127.0.0.1:6206\n\nserver:\n command: \"php php_test_files/grpc/worker-grpc.php\"\n relay:"
},
{
"path": "tests/configs/.rr-grpc.yaml",
"chars": 440,
"preview": "version: '3'\n\nrpc:\n listen: tcp://127.0.0.1:6204\n\nserver:\n command: \"php php_test_files/grpc/worker-grpc.php\"\n relay:"
},
{
"path": "tests/configs/.rr-http-middleware.yaml",
"chars": 601,
"preview": "version: '3'\n\nrpc:\n listen: tcp://127.0.0.1:6202\n\nserver:\n command: \"php php_test_files/http/client.php echo pipes\"\n "
},
{
"path": "tests/configs/.rr-http-otel.yaml",
"chars": 457,
"preview": "version: '3'\n\nrpc:\n listen: tcp://127.0.0.1:6205\n\nserver:\n command: \"php php_test_files/http/client.php echo pipes\"\n "
},
{
"path": "tests/configs/.rr-http-static.yaml",
"chars": 408,
"preview": "version: '3'\n\nrpc:\n listen: tcp://127.0.0.1:6203\n\nserver:\n command: \"php php_test_files/http/client.php echo pipes\"\n "
},
{
"path": "tests/configs/.rr-jobs-memory-otel.yaml",
"chars": 643,
"preview": "version: '3'\n\nrpc:\n listen: tcp://127.0.0.1:6207\n\nserver:\n command: \"php php_test_files/jobs/jobs_ok.php\"\n relay: \"pi"
},
{
"path": "tests/configs/.rr-jobs-memory.yaml",
"chars": 522,
"preview": "version: '3'\n\nrpc:\n listen: tcp://127.0.0.1:6201\n\nserver:\n command: \"php php_test_files/jobs/jobs_ok.php\"\n relay: \"pi"
},
{
"path": "tests/doc.go",
"chars": 288,
"preview": "// Package tests contains end-to-end integration tests for RoadRunner.\n// Tests exercise the full plugin stack via the E"
},
{
"path": "tests/e2e_grpc_test.go",
"chars": 4867,
"preview": "package tests\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"os\"\n\t\"os/signal\"\n\t\"sync\"\n\t\"syscall\"\n\t\"testing\"\n\t\"time\""
},
{
"path": "tests/e2e_http_test.go",
"chars": 8377,
"preview": "package tests\n\nimport (\n\tcompressGzip \"compress/gzip\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"log/slog\"\n\t\"net/http\"\n\t\"os\"\n\t\"os/signal\"\n"
},
{
"path": "tests/e2e_jobs_test.go",
"chars": 5078,
"preview": "package tests\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"os\"\n\t\"os/signal\"\n\t\"sync\"\n\t\"syscall\"\n\t\"testing\"\n\t\"time\"\n\n\tmocklogg"
},
{
"path": "tests/go.mod",
"chars": 6422,
"preview": "module tests\n\ngo 1.26.1\n\nrequire (\n\tgithub.com/google/uuid v1.6.0\n\tgithub.com/roadrunner-server/api/v4 v4.23.0\n\tgithub.c"
},
{
"path": "tests/go.sum",
"chars": 29486,
"preview": "code.pfad.fr/check v1.1.0 h1:GWvjdzhSEgHvEHe2uJujDcpmZoySKuHQNrZMfzfO0bE=\ncode.pfad.fr/check v1.1.0/go.mod h1:NiUH13DtYs"
},
{
"path": "tests/helpers/doc.go",
"chars": 271,
"preview": "// Package helpers provides RPC helper functions for end-to-end tests.\n// Each helper returns a func(t *testing.T) suita"
},
{
"path": "tests/helpers/helpers.go",
"chars": 3135,
"preview": "package helpers\n\nimport (\n\t\"context\"\n\t\"net\"\n\t\"net/rpc\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/google/uuid\"\n\tjobsProto \"github."
},
{
"path": "tests/mock/doc.go",
"chars": 199,
"preview": "// Package mocklogger provides a mock logger plugin for integration tests.\n// It implements the Endure plugin interface "
},
{
"path": "tests/mock/logger.go",
"chars": 1660,
"preview": "package mocklogger\n\nimport (\n\t\"github.com/roadrunner-server/endure/v2/dep\"\n\t\"go.uber.org/zap\"\n\t\"go.uber.org/zap/zapcore\""
},
{
"path": "tests/mock/observer.go",
"chars": 5483,
"preview": "package mocklogger\n\n// Copyright (c) 2017 Uber Technologies, Inc.\n//\n// Permission is hereby granted, free of charge, to"
},
{
"path": "tests/php_test_files/.gitignore",
"chars": 22,
"preview": "vendor/\ncomposer.lock\n"
},
{
"path": "tests/php_test_files/composer.json",
"chars": 516,
"preview": "{\n \"name\": \"test/e2e\",\n \"description\": \"PHP dependencies for RoadRunner e2e tests\",\n \"minimum-stability\": \"dev\",\n \"p"
},
{
"path": "tests/php_test_files/grpc/src/EchoService.php",
"chars": 351,
"preview": "<?php\n/**\n * Sample GRPC PHP server.\n */\n\nuse Spiral\\RoadRunner\\GRPC\\ContextInterface;\nuse Service\\EchoInterface;\nuse Se"
},
{
"path": "tests/php_test_files/grpc/src/Health/HealthCheckRequest.php",
"chars": 1284,
"preview": "<?php\n# Generated by the protocol buffer compiler. DO NOT EDIT!\n# source: health.proto\n\nnamespace Health;\n\nuse Google\\P"
},
{
"path": "tests/php_test_files/grpc/src/Health/HealthCheckResponse/ServingStatus.php",
"chars": 1745,
"preview": "<?php\n# Generated by the protocol buffer compiler. DO NOT EDIT!\n# source: health.proto\n\nnamespace Health\\HealthCheckRes"
},
{
"path": "tests/php_test_files/grpc/src/Health/HealthCheckResponse.php",
"chars": 1438,
"preview": "<?php\n# Generated by the protocol buffer compiler. DO NOT EDIT!\n# source: health.proto\n\nnamespace Health;\n\nuse Google\\P"
},
{
"path": "tests/php_test_files/grpc/src/Health/HealthInterface.php",
"chars": 852,
"preview": "<?php\n# Generated by the protocol buffer compiler (spiral/php-grpc). DO NOT EDIT!\n# source: health.proto\n\nnamespace Heal"
},
{
"path": "tests/php_test_files/grpc/src/HealthService.php",
"chars": 707,
"preview": "<?php\n/**\n * Sample GRPC PHP server.\n */\n\nuse Spiral\\RoadRunner\\GRPC\\ContextInterface;\nuse Health\\HealthInterface;\nuse H"
},
{
"path": "tests/php_test_files/grpc/src/Service/EchoInterface.php",
"chars": 526,
"preview": "<?php\n# Generated by the protocol buffer compiler (roadrunner-server/grpc). DO NOT EDIT!\n# source: service.proto\n\nnamesp"
},
{
"path": "tests/php_test_files/grpc/src/Service/Message.php",
"chars": 1222,
"preview": "<?php\n# Generated by the protocol buffer compiler. DO NOT EDIT!\n# source: service.proto\n\nnamespace Service;\n\nuse Google"
},
{
"path": "tests/php_test_files/grpc/worker-grpc.php",
"chars": 428,
"preview": "<?php\n\n/**\n * Sample gRPC PHP server for e2e tests.\n */\n\nuse Service\\EchoInterface;\nuse Health\\HealthInterface;\nuse Spir"
},
{
"path": "tests/php_test_files/http/client.php",
"chars": 1361,
"preview": "<?php\n\n/**\n * Generic PSR-7 HTTP worker dispatcher.\n * Usage: php client.php <handler_name> <relay_type>\n *\n * handler_n"
},
{
"path": "tests/php_test_files/http/echo.php",
"chars": 405,
"preview": "<?php\n\n/**\n * Echo handler: uppercases the \"hello\" query parameter and returns it with 201 status.\n */\n\nuse Psr\\Http\\Mes"
},
{
"path": "tests/php_test_files/jobs/jobs_ok.php",
"chars": 387,
"preview": "<?php\n\n/**\n * Simple jobs consumer that acknowledges every task immediately.\n */\n\nuse Spiral\\RoadRunner\\Jobs\\Consumer;\n\n"
},
{
"path": "tests/proto/service/service.pb.go",
"chars": 4420,
"preview": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.28.0-devel\n// \tprotoc v3.21.2\n"
},
{
"path": "tests/proto/service/service.proto",
"chars": 166,
"preview": "syntax = \"proto3\";\n\npackage service;\noption go_package = \"./;service\";\n\nservice Echo {\n rpc Ping(Message) returns (Mess"
},
{
"path": "tests/proto/service/service_grpc.pb.go",
"chars": 3277,
"preview": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.2.0\n// - protoc "
},
{
"path": "tests/testdata/sample.txt",
"chars": 97,
"preview": "Hello from RoadRunner e2e static file test!\nThis file is served by the static middleware plugin.\n"
}
]
// ... and 1 more files (download for full content)
About this extraction
This page contains the full source code of the roadrunner-server/roadrunner GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 146 files (642.9 KB), approximately 197.0k tokens, and a symbol index with 227 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.