-
-
Notifications
You must be signed in to change notification settings - Fork 1.8k
refactor: try to use utils.getCallSites instead #5665
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
add benchmark
|
Note Other AI code review bot(s) detectedCodeRabbit has detected other AI code review bot(s) in this pull request and will avoid duplicating their findings in the review comments. This may lead to a less comprehensive review. WalkthroughRefactors benchmark HTTP suite to TypeScript, adds docs and a run script, updates controllers/routes and package.json, enhances stack-trace utilities and tests, and marks flaky Windows tests to skip. Changes
Sequence Diagram(s)sequenceDiagram
participant S as run.sh (controller)
participant N as npm server
participant C as curl (smoke checks)
participant W as wrk (load test)
rect rgba(135,206,235,0.12)
Note over S,N: Start phase
S->>N: npm run start (background)
N-->>S: PID
end
rect rgba(144,238,144,0.12)
Note over S,C: Verification phase
S->>S: log system & Node info
S->>C: curl /hello-egg
S->>C: curl /hello-tegg
C-->>S: HTTP responses
end
rect rgba(255,228,181,0.12)
Note over S,W: Load test phase
S->>W: wrk against /hello-egg
W-->>S: results
S->>W: wrk against /hello-tegg
W-->>S: results
end
rect rgba(240,128,128,0.12)
Note over S,N: Teardown
S->>N: kill PID (npm stop)
N-->>S: stopped
end
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes
Possibly related PRs
Poem
Pre-merge checks and finishing touches❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✨ Finishing touches
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Summary of ChangesHello @fengmk2, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed! This pull request primarily focuses on enhancing stack trace utility and introducing performance benchmarking. The Highlights
Using Gemini Code AssistThe full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips. Invoking Gemini You can request assistance from Gemini at any point by creating a comment using either
Customization To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a Limitations & Feedback Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here. You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension. Footnotes
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Code Review
This pull request refactors stack trace retrieval to use the more efficient util.getCallSites where available, and adds a comprehensive benchmark suite to compare performance between tegg HttpController and egg router Controller. The changes are a good improvement, especially the performance optimization and the addition of benchmarks. I've found a critical issue that could lead to a crash, a few high-severity issues including a type error and a test suite misconfiguration, and some medium-severity suggestions for improving code clarity. Please see my detailed comments.
Deploying egg with
|
| Latest commit: |
b6c5a64
|
| Status: | ✅ Deploy successful! |
| Preview URL: | https://10f5ca66.egg-cci.pages.dev |
| Branch Preview URL: | https://use-nodejs-getcallsites.egg-cci.pages.dev |
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## next #5665 +/- ##
==========================================
- Coverage 87.60% 87.43% -0.18%
==========================================
Files 561 561
Lines 10912 10931 +19
Branches 1231 1238 +7
==========================================
- Hits 9559 9557 -2
- Misses 1272 1290 +18
- Partials 81 84 +3 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
Deploying egg-v3 with
|
| Latest commit: |
b6c5a64
|
| Status: | ✅ Deploy successful! |
| Preview URL: | https://04650ef4.egg-v3.pages.dev |
| Branch Preview URL: | https://use-nodejs-getcallsites.egg-v3.pages.dev |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull Request Overview
This PR refactors the StackUtil implementation to use Node.js's new util.getCallSites() API with fallback to the legacy Error stack trace approach, adds comprehensive test coverage, and updates the tegg HTTP benchmark to use modern TypeScript and ESM modules. The PR also includes documentation improvements with benchmark results.
Key changes:
- Modernizes StackUtil to use
util.getCallSites()with legacy fallback - Adds comprehensive test coverage for StackUtil with 13 test cases
- Converts tegg benchmark from CommonJS to TypeScript/ESM
- Updates benchmark dependencies to beta versions
Reviewed Changes
Copilot reviewed 16 out of 16 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| tegg/core/common-util/test/StackUtil.test.ts | New comprehensive test suite for StackUtil with 13 test cases covering various scenarios |
| tegg/core/common-util/src/StackUtil.ts | Refactors getCalleeFromStack to use util.getCallSites() with legacy fallback, adds JSDoc |
| tegg/benchmark/http/run.sh | New benchmark runner script for automated performance testing |
| tegg/benchmark/http/package.json | Updates dependencies to beta versions and adds build/bench scripts |
| tegg/benchmark/http/config/plugin.js | Removed - tegg plugins now integrated into main egg package |
| tegg/benchmark/http/config/config.default.ts | New TypeScript config replacing CommonJS version |
| tegg/benchmark/http/config/config.default.js | Removed - replaced by TypeScript version |
| tegg/benchmark/http/app/router.ts | New TypeScript router replacing CommonJS version |
| tegg/benchmark/http/app/router.js | Removed - replaced by TypeScript version |
| tegg/benchmark/http/app/controller/template/egg_controller_1.ts | New TypeScript controller with version info |
| tegg/benchmark/http/app/controller/template/egg_controller_1.js | Removed - replaced by TypeScript version |
| tegg/benchmark/http/app/controller/FooTeggController.ts | Updates import path and response to include version info |
| tegg/benchmark/http/README.md | New comprehensive benchmark documentation with results |
| tegg/benchmark/http/.gitignore | New gitignore for generated files |
| packages/utils/src/import.ts | Adds clarifying comment about EGG_TS_ENABLE behavior |
| packages/core/src/utils/index.ts | Updates egg-mock GitHub URL to 5.x branch |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 4
🧹 Nitpick comments (4)
packages/utils/src/import.ts (1)
55-61: Avoid assuming Node ≥ 22 implies TS runtime support.Relying on Node version alone can resolve to .ts files without a loader, breaking imports. Prefer checking only loader-registered extensions/env toggles.
Apply:
- process.env.EGG_TS_ENABLE === 'true' || - parseInt(process.versions.node.split('.', 1)[0], 10) >= 22; + process.env.EGG_TS_ENABLE === 'true';Optionally, add a loader/CLI check (e.g., EGG_TS_LOADER set by eggctl/oxc/ts-node) if you want an explicit runtime toggle.
Would you confirm that eggctl (or your runtime) always registers a TS loader before importModule is used? If not, the Node ≥ 22 branch risks runtime failures.
tegg/benchmark/http/config/config.default.ts (1)
1-5: Drop redundant type cast for clarity.
defineConfigreturnsPartialEggConfig; the final cast is unnecessary.-export default defineConfig({ - keys: 'tegg_benchmark', -}) as PartialEggConfig; +export default defineConfig({ + keys: 'tegg_benchmark', +});tegg/benchmark/http/package.json (1)
3-3: Tighten scripts and deps for the benchmark package.
- Move build-time only packages to devDependencies:
@eggjs/tsconfig,@types/node.devusesegg-binbut it's not declared. Either add it or replace with aneggctldev equivalent if available.- Mark package as private to avoid accidental publish.
- If
/app/controlleruses JSON import attributes requiring Node ≥ 22, declare engines.Suggested patch:
{ "name": "tegg_benchmark", "type": "module", + "private": true, + "engines": { + "node": ">=18" + }, "scripts": { "start": "eggctl start --workers 4", "stop": "eggctl stop", - "dev": "egg-bin dev", + "dev": "egg-bin dev", "build": "tsc", "prebench": "npm run build", "bench": "sh run.sh" }, "dependencies": { - "@eggjs/tsconfig": "beta", - "@types/node": "24", "egg": "beta" }, "devDependencies": { "@eggjs/bin": "beta", "@eggjs/scripts": "beta", - "typescript": "5" + "typescript": "5", + "@types/node": "24", + "@eggjs/tsconfig": "beta", + "egg-bin": "latest" } }Adjust
engines.nodeto>=22if keepingwith { type: 'json' }.Please confirm whether
egg-binis expected to be available via the monorepo toolchain; if not, thedevscript will fail without adding it here.Also applies to: 5-11, 13-16, 18-21
tegg/core/common-util/src/StackUtil.ts (1)
55-66: Nit: logging label suggests util.getCallSites even on fallback.Consider changing the prefix to a neutral “stacks:” to avoid confusion when the fallback path is taken.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (16)
packages/core/src/utils/index.ts(1 hunks)packages/utils/src/import.ts(1 hunks)tegg/benchmark/http/.gitignore(1 hunks)tegg/benchmark/http/README.md(1 hunks)tegg/benchmark/http/app/controller/FooTeggController.ts(1 hunks)tegg/benchmark/http/app/controller/template/egg_controller_1.js(0 hunks)tegg/benchmark/http/app/controller/template/egg_controller_1.ts(1 hunks)tegg/benchmark/http/app/router.js(0 hunks)tegg/benchmark/http/app/router.ts(1 hunks)tegg/benchmark/http/config/config.default.js(0 hunks)tegg/benchmark/http/config/config.default.ts(1 hunks)tegg/benchmark/http/config/plugin.js(0 hunks)tegg/benchmark/http/package.json(1 hunks)tegg/benchmark/http/run.sh(1 hunks)tegg/core/common-util/src/StackUtil.ts(2 hunks)tegg/core/common-util/test/StackUtil.test.ts(1 hunks)
💤 Files with no reviewable changes (4)
- tegg/benchmark/http/config/plugin.js
- tegg/benchmark/http/app/router.js
- tegg/benchmark/http/app/controller/template/egg_controller_1.js
- tegg/benchmark/http/config/config.default.js
🧰 Additional context used
📓 Path-based instructions (6)
packages/**/src/**/*.{ts,tsx}
📄 CodeRabbit inference engine (.github/copilot-instructions.md)
Use TypeScript for all source files in packages (no JavaScript source files)
Files:
packages/utils/src/import.tspackages/core/src/utils/index.ts
**/*.ts
📄 CodeRabbit inference engine (AGENTS.md)
**/*.ts: Prefer TypeScript and ESM: write sources and exports in .ts (ESM-first) rather than CommonJS
Use two-space indentation, trailing commas, and semicolons (Prettier/oxlint defaults)
Name files in lowercase with hyphens (e.g., loader-context.ts)
Name classes in PascalCase
Name functions and variables in camelCase
Re-export types thoughtfully to keep the public API stable
Files:
packages/utils/src/import.tspackages/core/src/utils/index.tstegg/core/common-util/src/StackUtil.tstegg/core/common-util/test/StackUtil.test.tstegg/benchmark/http/app/controller/template/egg_controller_1.tstegg/benchmark/http/app/controller/FooTeggController.tstegg/benchmark/http/app/router.tstegg/benchmark/http/config/config.default.ts
{packages/**,plugins/**,tools/!(egg-bin)/**}/**/*.ts
📄 CodeRabbit inference engine (CLAUDE.md)
{packages/**,plugins/**,tools/!(egg-bin)/**}/**/*.ts: For isolatedDeclarations support, all exported functions/methods/getters must have explicit return type annotations
Avoid computed property names with symbols in class declarations (no get SYM)
Add explicit type annotations for class properties when needed (no inferred exported property types)
Exported symbols must use unique symbol type (e.g., export const X: unique symbol = Symbol('x'))
Files:
packages/utils/src/import.tspackages/core/src/utils/index.ts
tegg/**/src/**/*.{ts,tsx,js,mjs}
📄 CodeRabbit inference engine (tegg/CLAUDE.md)
Do not use CommonJS APIs (require, module.exports); author code as ESM
Files:
tegg/core/common-util/src/StackUtil.ts
tegg/**/src/**/*.{ts,tsx}
📄 CodeRabbit inference engine (tegg/CLAUDE.md)
Use .js extensions in ESM import specifiers in TypeScript source
Files:
tegg/core/common-util/src/StackUtil.ts
**/test/**/*.test.ts
📄 CodeRabbit inference engine (AGENTS.md)
**/test/**/*.test.ts: Place test suites following Vitest discovery: /test//*.test.ts
Mirror the repository test pattern when adding new suites
Files:
tegg/core/common-util/test/StackUtil.test.ts
🧠 Learnings (3)
📚 Learning: 2025-10-23T17:37:37.549Z
Learnt from: CR
PR: eggjs/egg#0
File: tegg/CLAUDE.md:0-0
Timestamp: 2025-10-23T17:37:37.549Z
Learning: Applies to tegg/{core,plugin,standalone}/*/package.json : Set package.json "type": "module" (ESM only; no CommonJS) in all tegg packages
Applied to files:
tegg/benchmark/http/package.json
📚 Learning: 2025-10-23T17:37:37.549Z
Learnt from: CR
PR: eggjs/egg#0
File: tegg/CLAUDE.md:0-0
Timestamp: 2025-10-23T17:37:37.549Z
Learning: Run build, test, and versioning commands from the monorepo root (Egg.js repo), not from tegg/
Applied to files:
tegg/benchmark/http/package.json
📚 Learning: 2025-10-23T17:37:37.549Z
Learnt from: CR
PR: eggjs/egg#0
File: tegg/CLAUDE.md:0-0
Timestamp: 2025-10-23T17:37:37.549Z
Learning: Applies to tegg/plugin/*/package.json : Plugin packages must define eggPlugin in package.json with dependencies
Applied to files:
tegg/benchmark/http/package.json
🧬 Code graph analysis (5)
tegg/core/common-util/src/StackUtil.ts (1)
plugins/multipart/test/fixtures/apps/multipart-for-await/app/controller/upload.js (1)
util(6-6)
tegg/core/common-util/test/StackUtil.test.ts (1)
tegg/core/common-util/src/StackUtil.ts (1)
StackUtil(15-98)
tegg/benchmark/http/app/controller/template/egg_controller_1.ts (1)
tools/egg-bin/test/fixtures/example-ts-cluster/node_modules/egg/index.js (1)
pkg(1-1)
tegg/benchmark/http/app/controller/FooTeggController.ts (1)
packages/egg/src/index.ts (2)
HTTPMethod(157-157)HTTPMethodEnum(158-158)
tegg/benchmark/http/config/config.default.ts (1)
packages/egg/src/lib/define.ts (1)
defineConfig(29-31)
🪛 Shellcheck (0.11.0)
tegg/benchmark/http/run.sh
[warning] 5-5: pid appears unused. Verify use (or export if used externally).
(SC2034)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
- GitHub Check: Socket Security: Pull Request Alerts
- GitHub Check: Test bin (ubuntu-latest, 22, 0/3)
- GitHub Check: Analyze (javascript-typescript)
🔇 Additional comments (14)
tegg/benchmark/http/.gitignore (1)
1-3: LGTM for benchmark artifacts ignore.Good to ignore TS outputs and logs in this subpackage.
tegg/benchmark/http/app/controller/FooTeggController.ts (2)
11-11: String format looks fine.Version-tagged greeting is straightforward and stable.
2-2: The code is correct; no changes needed.The root package.json specifies
"engines": { "node": ">=22.18.0" }. Thewith { type: 'json' }syntax is supported unflagged in Node 22.10.0 and later. Since the codebase explicitly targets Node ≥22.18.0, the import statement is compatible and no alternatives are required.Likely an incorrect or invalid review comment.
tegg/core/common-util/src/StackUtil.ts (2)
24-27: API change verified; all call sites are compatible with optional parameter defaults.The grep search confirms all 8 production usages explicitly specify
stackIndexvalues (4 or 5), ensuring no callers depend on the default. ThewithLinedefault of false aligns with all existing calls. No breaking changes detected.
28-33: Review comment is inapplicable to this codebase.The codebase explicitly requires Node >= 22.18.0, which is well above the minimum version where
util.getCallSites()is available. Theutil.getCallSites()function was added in Node.js v22.9.0 and its types are available in @types/node from that version forward. The code already has a proper guard (if (typeof util.getCallSites === 'function')), the types are imported directly from'node:util', and the fallback will never execute in the supported runtime environment. The review's concern about the fallback being used on older Node versions does not apply here.Likely an incorrect or invalid review comment.
packages/core/src/utils/index.ts (1)
39-39: LGTM! Documentation updated to match current branch.The URL reference correctly points to the 5.x branch, keeping the comment aligned with the current codebase structure.
tegg/core/common-util/test/StackUtil.test.ts (2)
1-137: LGTM! Comprehensive test coverage.The test suite is well-structured with helper functions to create predictable stack frames, and covers essential scenarios including line number formatting, stack index handling, nested calls, edge cases, and path validation.
148-171: LGTM! Good coverage of class method scenarios.The tests appropriately cover both instance and static method call patterns.
tegg/benchmark/http/app/router.ts (1)
1-5: LGTM! Clean TypeScript router implementation.The router correctly registers the
/hello-eggendpoint with proper TypeScript typing for the Application parameter.tegg/benchmark/http/README.md (1)
1-130: LGTM! Comprehensive benchmark documentation.The documentation provides clear setup instructions and detailed benchmark results across multiple Node.js versions with system information, making it easy to understand and reproduce the benchmarks.
tegg/benchmark/http/run.sh (2)
7-12: LGTM! Good practice to log system information.Capturing OS, CPU model, speed, cores, Node.js version, and timestamp provides essential context for benchmark results.
14-33: LGTM! Well-structured benchmark execution.The script appropriately waits for the server to start, verifies both endpoints with curl, and then runs comprehensive load tests with wrk.
tegg/benchmark/http/app/controller/template/egg_controller_1.ts (2)
1-2: LGTM! Modern import assertion syntax.Using
with { type: 'json' }follows the standardized import assertion syntax for JSON modules.
4-7: LGTM! Controller correctly returns version-tagged response.The controller implementation is clean and correctly formats the response body with the egg version from package.json.
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
🧹 Nitpick comments (2)
plugins/schedule/test/customTypeError.test.ts (1)
8-9: Consider creating a tracking issue for this Windows flakiness.The conditional skip is consistent with existing patterns in the codebase and pragmatically addresses CI flakiness. However, skipping reduces Windows test coverage for cluster-based scheduling behavior.
Consider:
- Creating a GitHub issue to track the root cause investigation (hook timeout suggests async cleanup or cluster startup timing issues on Windows)
- Investigating whether increasing the hook timeout or adjusting the cluster configuration could make the test stable on Windows
packages/egg/test/egg.test.ts (1)
199-200: Multiple Windows skips in this file suggest a systemic issue.The conditional skip is consistent with the existing pattern used at lines 169, 184, 419, and 439. However, this file now has 5 test suites skipped on Windows, significantly reducing coverage for config dumping, timing, and context creation on that platform.
Since multiple tests in this file exhibit Windows flakiness with hook timeouts, consider:
- Creating a single tracking issue for Windows test stability in this suite
- Investigating whether a common infrastructure change (e.g., extended timeouts, improved cleanup, or CI-specific configuration) could address multiple skips
- Documenting any known Windows-specific limitations in the test setup utilities
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (3)
packages/egg/test/egg.test.ts(1 hunks)plugins/schedule/test/customTypeError.test.ts(1 hunks)tegg/core/common-util/test/StackUtil.test.ts(1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
- tegg/core/common-util/test/StackUtil.test.ts
🧰 Additional context used
📓 Path-based instructions (6)
packages/**/test/**/*.test.ts
📄 CodeRabbit inference engine (.github/copilot-instructions.md)
packages/**/test/**/*.test.ts: Name test files as test/**/*.test.ts and run them with Vitest
Use import { describe, it } from 'vitest' in tests
Use Node.js built-in assert module for test assertions
Files:
packages/egg/test/egg.test.ts
**/*.ts
📄 CodeRabbit inference engine (AGENTS.md)
**/*.ts: Prefer TypeScript and ESM: write sources and exports in .ts (ESM-first) rather than CommonJS
Use two-space indentation, trailing commas, and semicolons (Prettier/oxlint defaults)
Name files in lowercase with hyphens (e.g., loader-context.ts)
Name classes in PascalCase
Name functions and variables in camelCase
Re-export types thoughtfully to keep the public API stable
Files:
packages/egg/test/egg.test.tsplugins/schedule/test/customTypeError.test.ts
**/test/**/*.test.ts
📄 CodeRabbit inference engine (AGENTS.md)
**/test/**/*.test.ts: Place test suites following Vitest discovery: /test//*.test.ts
Mirror the repository test pattern when adding new suites
Files:
packages/egg/test/egg.test.tsplugins/schedule/test/customTypeError.test.ts
{packages/**,plugins/**,tools/!(egg-bin)/**}/**/*.ts
📄 CodeRabbit inference engine (CLAUDE.md)
{packages/**,plugins/**,tools/!(egg-bin)/**}/**/*.ts: For isolatedDeclarations support, all exported functions/methods/getters must have explicit return type annotations
Avoid computed property names with symbols in class declarations (no get SYM)
Add explicit type annotations for class properties when needed (no inferred exported property types)
Exported symbols must use unique symbol type (e.g., export const X: unique symbol = Symbol('x'))
Files:
packages/egg/test/egg.test.tsplugins/schedule/test/customTypeError.test.ts
{packages/!(cookies)/**/test/**/*.test.ts,plugins/**/test/**/*.test.ts}
📄 CodeRabbit inference engine (CLAUDE.md)
Vitest test files must follow the naming pattern test/**/*.test.ts
Files:
packages/egg/test/egg.test.tsplugins/schedule/test/customTypeError.test.ts
{packages/**/test/**,plugins/**/test/**}
📄 CodeRabbit inference engine (CLAUDE.md)
Use Node.js assert for assertions in Vitest tests
Files:
packages/egg/test/egg.test.tsplugins/schedule/test/customTypeError.test.ts
🧠 Learnings (2)
📓 Common learnings
Learnt from: CR
PR: eggjs/egg#0
File: AGENTS.md:0-0
Timestamp: 2025-09-18T07:56:17.417Z
Learning: For features affecting HTTP or process orchestration, add regression tests that exercise both the CommonJS and TypeScript example apps
📚 Learning: 2025-10-23T17:37:37.567Z
Learnt from: CR
PR: eggjs/egg#0
File: tegg/CLAUDE.md:0-0
Timestamp: 2025-10-23T17:37:37.567Z
Learning: Applies to tegg/plugin/*/{test,tests}/**/*.ts : Add Vitest tests for plugins using eggjs/mock; tests will be discovered by the root vitest config
Applied to files:
packages/egg/test/egg.test.ts
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (20)
- GitHub Check: Test (macos-latest, 24, 1/5)
- GitHub Check: Test (windows-latest, 24, 2/5)
- GitHub Check: Test (macos-latest, 24, 4/5)
- GitHub Check: Test (ubuntu-latest, 22, 3/5)
- GitHub Check: Test (windows-latest, 22, 2/5)
- GitHub Check: Test (macos-latest, 24, 5/5)
- GitHub Check: Test (windows-latest, 22, 3/5)
- GitHub Check: Test (ubuntu-latest, 22, 2/5)
- GitHub Check: Test (windows-latest, 22, 5/5)
- GitHub Check: Test (macos-latest, 24, 2/5)
- GitHub Check: Test (macos-latest, 22, 2/5)
- GitHub Check: Test (windows-latest, 24, 1/5)
- GitHub Check: Test (ubuntu-latest, 24, 2/5)
- GitHub Check: Test (ubuntu-latest, 24, 1/5)
- GitHub Check: Test bin (ubuntu-latest, 22, 0/3)
- GitHub Check: Test bin (windows-latest, 22, 1/3)
- GitHub Check: Test bin (windows-latest, 22, 0/3)
- GitHub Check: Test bin (windows-latest, 22, 2/3)
- GitHub Check: Test bin (ubuntu-latest, 22, 1/3)
- GitHub Check: typecheck

and add benchmark
Summary by CodeRabbit
New Features
Documentation
Tests
Chores