Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
1055fbb
chore: archive Kotlin source and initialize TypeScript project
gadenbuie Mar 9, 2026
4c28d02
feat: implement Phase 1 — recording parser and foundation modules
gadenbuie Mar 9, 2026
8452a48
feat: implement Phase 2 — HTTP client, auth, and WebSocket wrapper
gadenbuie Mar 9, 2026
e9b93f1
feat: implement Phase 3 — session playback, logger, and CSV output
gadenbuie Mar 9, 2026
7fbf6ac
feat: implement Phase 4 — worker orchestration, CLI, and entry point
gadenbuie Mar 9, 2026
8351d16
feat: implement Phase 5 — version injection, CI pipeline, and initial…
gadenbuie Mar 9, 2026
1b16a8b
docs: update NEWS.md
gadenbuie Mar 9, 2026
559ac7a
test: add comprehensive test suite (unit, integration, and behavioral…
gadenbuie Mar 9, 2026
ddb6d13
feat: make app-url optional and show help when invoked with no arguments
gadenbuie Mar 10, 2026
db698f1
feat: add terminal UI with live progress display
gadenbuie Mar 10, 2026
1ff5a42
feat: add Jupyter widget / shinywidgets support
gadenbuie Mar 10, 2026
023faa4
ci: replace build.yml with check.yml CI pipeline
gadenbuie Mar 10, 2026
fee6919
fix: signal handling, clean process exit, and stdin cleanup
gadenbuie Mar 10, 2026
8bf2026
fix: only ignore empty update messages with empty arrays in canIgnore
gadenbuie Mar 10, 2026
d8b31e1
chore: remove archived Kotlin implementation
gadenbuie Mar 10, 2026
4d38529
refactor: move load testing behind `loadtest` subcommand
gadenbuie Mar 10, 2026
ac0b878
feat: add AbortSignal support for graceful worker shutdown
gadenbuie Mar 10, 2026
0660a77
fix: store cookies against final redirect URL instead of original
gadenbuie Mar 10, 2026
19a6244
refactor: rename package to @posit-dev/shinyloadtest and restructure CLI
gadenbuie Mar 11, 2026
ae5e08c
fix: track canceled sessions separately from failures
gadenbuie Mar 11, 2026
da09916
chore: add pre-push hook and apply standard style formatting
gadenbuie Mar 11, 2026
4d6dfa2
feat: add event throughput stats to loaded-phase status display
gadenbuie Mar 11, 2026
71647fc
fix: test reliability improvements and SILENT log level support
gadenbuie Mar 11, 2026
8a84f50
feat: add example apps for loadtest demos
gadenbuie Mar 11, 2026
1541c12
docs: update README for shinyloadtest rename and new CLI
gadenbuie Mar 17, 2026
b9f2c32
fix: handle malformed WS frames and add 401 to isProtected
gadenbuie Mar 17, 2026
c92e1ee
docs: add CLAUDE.md project orientation notes
gadenbuie Mar 18, 2026
9c75aa7
docs: update NEWS.md for shinyloadtest 2.0.0 rewrite
gadenbuie Mar 18, 2026
c89af03
chore: rename test temp dir prefixes from shinycannon to shinyloadtest
gadenbuie Mar 18, 2026
e335aab
chore: Add claude settings
gadenbuie Mar 18, 2026
b0ac0bf
chore: Add AGENTS.md
gadenbuie Mar 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
84 changes: 84 additions & 0 deletions .claude/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
{
"permissions": {
"allow": [
"Bash(ls:*)",
"Bash(pwd:*)",
"Bash(find:*)",
"Bash(file:*)",
"Bash(stat:*)",
"Bash(wc:*)",
"Bash(head:*)",
"Bash(tail:*)",
"Bash(cat:*)",
"Bash(tree:*)",
"Bash(git status:*)",
"Bash(git log:*)",
"Bash(git diff:*)",
"Bash(git show:*)",
"Bash(git branch:*)",
"Bash(git remote:*)",
"Bash(git tag:*)",
"Bash(git stash list:*)",
"Bash(git rev-parse:*)",
"Bash(git add:*)",
"Bash(git commit:*)",
"Bash(gh pr view:*)",
"Bash(gh pr list:*)",
"Bash(gh pr checks:*)",
"Bash(gh pr diff:*)",
"Bash(gh issue view:*)",
"Bash(gh issue list:*)",
"Bash(gh run view:*)",
"Bash(gh run list:*)",
"Bash(gh run logs:*)",
"Bash(gh repo view:*)",
"Bash(gh api:*)",
"Bash(node --version:*)",
"Bash(npm --version:*)",
"Bash(npm list:*)",
"Bash(npm view:*)",
"Bash(npm outdated:*)",
"Bash(npm ls:*)",
"Bash(tsc --version:*)",
"Bash(npx tsc --noEmit:*)",
"Bash(npm run build:*)",
"Bash(npm run test:*)",
"Bash(npm run typecheck:*)",
"Bash(npm run pre-push:*)",
"Bash(npm run lint:*)",
"Bash(npm run format:*)",
"Bash(npm run dev:*)",
"WebFetch(domain:docs.github.com)",
"WebFetch(domain:cli.github.com)",
"WebFetch(domain:react.dev)",
"WebFetch(domain:vitejs.dev)",
"WebFetch(domain:vitest.dev)",
"WebFetch(domain:tailwindcss.com)",
"WebFetch(domain:www.typescriptlang.org)",
"WebFetch(domain:npmjs.com)"
],
"deny": []
},
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": "jq -r '.tool_input.file_path' | { read file_path; if echo \"$file_path\" | grep -q '\\.tsx?$'; then npx prettier --write \"$file_path\"; fi; }"
},
{
"type": "command",
"command": "jq -r '.tool_input.file_path' | { read file_path; if echo \"$file_path\" | grep -q '\\.tsx?$'; then npx tsc --noEmit --pretty 2>&1; fi; }"
}
]
}
]
},
"preCommit": [
{
"command": "npx tsc --noEmit && npx eslint --quiet src/"
}
]
}
36 changes: 0 additions & 36 deletions .github/workflows/build.yml

This file was deleted.

84 changes: 84 additions & 0 deletions .github/workflows/check.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
name: check

on:
push:
branches: [main]
pull_request:
branches: [main]

concurrency:
group: check-${{ github.ref }}
cancel-in-progress: true

permissions:
contents: read

jobs:
lint:
name: Lint
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- run: npm ci
- run: npm run lint

typecheck:
name: Typecheck
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- run: npm ci
- run: npm run typecheck

test:
name: Test (Node ${{ matrix.node-version }})
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
node-version: [20, 22]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
cache: npm
- run: npm ci
- run: npm run build
- run: npm test

build:
name: Build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- run: npm ci
- run: npm run build

check:
name: check
if: always()
needs: [lint, typecheck, test, build]
runs-on: ubuntu-latest
steps:
- name: Check job results
run: |
if [[ "${{ needs.lint.result }}" != "success" ||
"${{ needs.typecheck.result }}" != "success" ||
"${{ needs.test.result }}" != "success" ||
"${{ needs.build.result }}" != "success" ]]; then
echo "One or more CI jobs failed or were cancelled."
exit 1
fi
14 changes: 10 additions & 4 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,15 @@
.DS_Store
.idea/
_ignore/
recordings/
test-logs-*

# TypeScript / Node.js
node_modules/
dist/
*.tsbuildinfo

# Kotlin / JVM (archived)
target/
package/
shinycannon.1
Expand All @@ -11,8 +21,4 @@ RELEASE_URLS.txt
.rpmdb/
.project
.settings/
_ignore/
out/
recordings/

test-logs-*
21 changes: 21 additions & 0 deletions .prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"arrowParens": "always",
"bracketSameLine": false,
"bracketSpacing": true,
"embeddedLanguageFormatting": "auto",
"endOfLine": "lf",
"htmlWhitespaceSensitivity": "css",
"insertPragma": false,
"jsxSingleQuote": true,
"printWidth": 80,
"proseWrap": "preserve",
"quoteProps": "as-needed",
"requirePragma": false,
"semi": false,
"singleAttributePerLine": true,
"singleQuote": false,
"tabWidth": 2,
"trailingComma": "all",
"useTabs": false,
"vueIndentScriptAndStyle": false
}
1 change: 1 addition & 0 deletions AGENTS.md
20 changes: 20 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
## About shinyloadtest

`@posit-dev/shinyloadtest` — a TypeScript/Node.js CLI tool for loadtesting [Shiny apps](https://shiny.posit.co/).
It is a rewrite and consolidation of [shinycannon](https://github.com/rstudio/shinycannon) (originally Kotlin/JVM) and the [shinyloadtest](https://rstudio.github.io/shinyloadtest) (R package and HTML/JavaScript assets).

We forked `rstudio/shinycannon` into `posit-dev/shinyloadtest` for the rewrite.
The original Kotlin source is in both repos; historical community issues and pull requests can be found in the original repo.

## Organization notes

- `packages/shinycannon/` — stub npm package so `npx shinycannon` resolves to this package/
- `_dev/` — git-ignored development artifacts used to store specs, plans, notes, etc.

## Key decisions

- `shinycannon` CLI command is a backwards-compatible alias for `shinyloadtest replay`
- `SHINYCANNON_*` env vars are accepted as fallbacks for `SHINYLOADTEST_*`
- Per-session `tough-cookie` jars provide cookie isolation between workers
- `AsyncQueue` in `websocket.ts` buffers inbound WS messages (capacity defined
in `types.ts`)
38 changes: 0 additions & 38 deletions Dockerfile

This file was deleted.

78 changes: 0 additions & 78 deletions Makefile

This file was deleted.

Loading
Loading