feat: optmize evault CRUD performance - #951

Merged
coodos merged 10 commits into
mainfrom
feat/evault-core-perf-optimization
May 2, 2026
Merged

feat: optmize evault CRUD performance#951
coodos merged 10 commits into
mainfrom
feat/evault-core-perf-optimization

Conversation

@coodos

@coodoscoodos commented Apr 14, 2026

Copy link
Copy Markdown
Contributor

Description of change

Added JWKs caching to reduce latency

Issue Number

Type of change

  • Update (a change which updates existing functionality)

How the change has been tested

Change checklist

  • I have ensured that the CI Checks pass locally
  • I have removed any unnecessary logic
  • My code is well documented
  • I have signed my commits
  • My code follows the pattern of the application
  • I have self reviewed my code

Summary by CodeRabbit

  • New Features

    • Webhooks now deliver the complete post-write state of updated envelopes, preventing receivers from unintentionally overwriting fields with partial data.
  • Bug Fixes

    • Fixed rate-limiting to properly prevent further request handling after rejection.
  • Performance Improvements

    • Added database indexing on envelope identifiers for faster lookups.
    • Implemented JWKS caching with configurable TTL for token validation.
    • Added performance monitoring and instrumentation across critical operations.

@coderabbitai

coderabbitaiBot commented Apr 14, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

Pull request was closed or merged during review

📝 Walkthrough

Walkthrough

This PR introduces performance timing instrumentation, refactors database meta-envelope operations to use transactional PATCH semantics with merged payloads, adds Neo4j id-field indexes, implements JWKS caching in authentication, updates GraphQL webhooks to deliver full post-write state, and fixes rate-limiting response handling.

Changes

Database Refactoring & Timing Infrastructure

Layer / File(s)Summary
Timing Utility
src/core/utils/timing.ts
New timed() async wrapper measures operation duration, logs slow calls (threshold EVAULT_TIMING_SLOW_MS), and exposes newTraceId() and timingEnabled() utilities. Disabled when EVAULT_TIMING=0.
Database Query Instrumentation
src/core/db/db.service.ts (lines 45–53)
runQueryInternal wraps session lifecycle in timed(...) with Cypher label derived from the first line of the query.
Meta-Envelope Storage
src/core/db/db.service.ts (lines 81–140)
storeMetaEnvelope now wrapped in timed("db.storeMetaEnvelope", ...). ID generation timing and write operations are separately timed.
Meta-Envelope Update Transactional Refactor
src/core/db/db.service.ts (lines 541–698)
updateMetaEnvelopeById refactored to execute full read-modify-write cycle inside a single session.executeWrite transaction using tx.run. Envelope deduplication now happens within the transaction. PATCH semantics enforced: stale envelopes no longer deleted; mergedPayload returned combining pre-existing and newly written envelopes.
Database Type Updates
src/core/db/types.ts
StoreMetaEnvelopeResult gains optional mergedPayload?: Record<string, any> field. Documentation clarified: envelopes are touched envelopes; mergedPayload is the complete post-write meta-envelope state.
Neo4j ID Indexes Migration
src/core/db/migrations/add-id-indexes.ts
New migration module exports createIdIndexes(driver) to create range/point-lookup indexes on Envelope.id and MetaEnvelope.id with IF NOT EXISTS guards.
GraphQL Webhook & Authentication
src/core/protocol/graphql-server.ts, src/core/protocol/vault-access-guard.ts
deliverWebhooks now logs single consolidated line per dispatch with stringified payload. updateMetaEnvelope and legacy updateMetaEnvelopeById webhook data now use result.mergedPayload ?? input.payload (full post-write state instead of input diff). VaultAccessGuard.validateToken caches JWKS per URL with TTL; checkAccess reuses cached context.tokenPayload. Both wrapped in timed() instrumentation.
Server Initialization & Rate Limiting
src/index.ts
Added createIdIndexes call during eVault startup. Fastify global rate-limiter now return reply after 429 response to prevent downstream handler execution.
Tests & Documentation
src/e2e/evault-core.e2e.spec.ts
Updated updateMetaEnvelopeById partial-update test to assert PATCH/merge semantics: fetched payload merges initial data with partial update rather than matching partial update alone.

Sequence Diagram

sequenceDiagram
participant Client
participant GraphQL
participant DBService
participant Neo4j
participant Webhook
Client->>GraphQL: updateMetaEnvelopeById(partialUpdate)
activate GraphQL
GraphQL->>DBService: updateMetaEnvelopeById(partialUpdate)
activate DBService
DBService->>Neo4j: session.executeWrite(tx => {...})
activate Neo4j
Neo4j->>Neo4j: Read existing envelopes
Neo4j->>Neo4j: Deduplicate by ontology
Neo4j->>Neo4j: Delete duplicate nodes (transaction)
Neo4j->>Neo4j: Update/Create envelopes via tx.run
Neo4j-->>DBService: Commit transaction
deactivate Neo4j
DBService->>DBService: Build mergedPayload (pre-existing + newly written)
DBService-->>GraphQL: Return {metaEnvelope, envelopes, mergedPayload}
deactivate DBService
GraphQL->>Webhook: deliverWebhooks(data: mergedPayload)
activate Webhook
Webhook->>Webhook: Log stringified payload with metadata
Webhook-->>GraphQL: Complete
deactivate Webhook
GraphQL-->>Client: Updated envelope with full post-write state
deactivate GraphQL
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

The refactoring involves dense transactional logic with careful state management (deduplication, PATCH semantics, merged payload construction), spans multiple interconnected files (db, types, graphql, auth), introduces new caching behavior, and requires verification that PATCH semantics and transactional integrity are correctly maintained across the read-modify-write cycle.

Possibly related PRs

Suggested labels

evault-refactor, database, transactional, performance-instrumentation, breaking-change

Suggested reviewers

  • sosweetham
  • xPathin

🐰 Transactional hops through the data warren,
PATCH semantics bloom where once was all-or-nothing,
Timers tick soft in the Neo4j burrow,
Full payloads emerge from the merged state—
A rabbit's reward for clean, careful writes.

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check nameStatusExplanationResolution
Description check⚠️ WarningThe description is incomplete. While it mentions JWKs caching (one optimization), it omits major changes: timing instrumentation, atomic transaction refactoring, database indexing, and webhook payload improvements. The 'How the change has been tested' section is blank.Provide a comprehensive description covering all key changes: JWKs caching, timing instrumentation, atomic transaction refactoring, database indexing, and webhook improvements. Specify how testing was performed.
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check nameStatusExplanation
Title check✅ PassedThe title focuses on optimizing CRUD performance, which aligns with the primary changes: adding timing instrumentation, JWKs caching, atomic transactions, and database indexing for performance improvements.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/evault-core-perf-optimization

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.

❤️ Share
Review rate limit: 0/1 reviews remaining, refill in 60 minutes.

Comment @coderabbitai help to get the list of available commands and usage tips.

@coodos
coodos marked this pull request as ready for review May 2, 2026 14:54
@coodos
coodos merged commit 2990789 into mainMay 2, 2026
5 of 6 checks passed
@coodos
coodos deleted the feat/evault-core-perf-optimization branch May 2, 2026 14:56
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@coodos
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat: optmize evault CRUD performance - #951

Merged
coodos merged 10 commits into
mainfrom
feat/evault-core-perf-optimization
May 2, 2026
Merged

feat: optmize evault CRUD performance#951
coodos merged 10 commits into
mainfrom
feat/evault-core-perf-optimization

Conversation

@coodos

@coodoscoodos commented Apr 14, 2026

Copy link
Copy Markdown
Contributor

Description of change

Added JWKs caching to reduce latency

Issue Number

Type of change

  • Update (a change which updates existing functionality)

How the change has been tested

Change checklist

  • I have ensured that the CI Checks pass locally
  • I have removed any unnecessary logic
  • My code is well documented
  • I have signed my commits
  • My code follows the pattern of the application
  • I have self reviewed my code

Summary by CodeRabbit

  • New Features

    • Webhooks now deliver the complete post-write state of updated envelopes, preventing receivers from unintentionally overwriting fields with partial data.
  • Bug Fixes

    • Fixed rate-limiting to properly prevent further request handling after rejection.
  • Performance Improvements

    • Added database indexing on envelope identifiers for faster lookups.
    • Implemented JWKS caching with configurable TTL for token validation.
    • Added performance monitoring and instrumentation across critical operations.

@coderabbitai

coderabbitaiBot commented Apr 14, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

Pull request was closed or merged during review

📝 Walkthrough

Walkthrough

This PR introduces performance timing instrumentation, refactors database meta-envelope operations to use transactional PATCH semantics with merged payloads, adds Neo4j id-field indexes, implements JWKS caching in authentication, updates GraphQL webhooks to deliver full post-write state, and fixes rate-limiting response handling.

Changes

Database Refactoring & Timing Infrastructure

Layer / File(s)Summary
Timing Utility
src/core/utils/timing.ts
New timed() async wrapper measures operation duration, logs slow calls (threshold EVAULT_TIMING_SLOW_MS), and exposes newTraceId() and timingEnabled() utilities. Disabled when EVAULT_TIMING=0.
Database Query Instrumentation
src/core/db/db.service.ts (lines 45–53)
runQueryInternal wraps session lifecycle in timed(...) with Cypher label derived from the first line of the query.
Meta-Envelope Storage
src/core/db/db.service.ts (lines 81–140)
storeMetaEnvelope now wrapped in timed("db.storeMetaEnvelope", ...). ID generation timing and write operations are separately timed.
Meta-Envelope Update Transactional Refactor
src/core/db/db.service.ts (lines 541–698)
updateMetaEnvelopeById refactored to execute full read-modify-write cycle inside a single session.executeWrite transaction using tx.run. Envelope deduplication now happens within the transaction. PATCH semantics enforced: stale envelopes no longer deleted; mergedPayload returned combining pre-existing and newly written envelopes.
Database Type Updates
src/core/db/types.ts
StoreMetaEnvelopeResult gains optional mergedPayload?: Record<string, any> field. Documentation clarified: envelopes are touched envelopes; mergedPayload is the complete post-write meta-envelope state.
Neo4j ID Indexes Migration
src/core/db/migrations/add-id-indexes.ts
New migration module exports createIdIndexes(driver) to create range/point-lookup indexes on Envelope.id and MetaEnvelope.id with IF NOT EXISTS guards.
GraphQL Webhook & Authentication
src/core/protocol/graphql-server.ts, src/core/protocol/vault-access-guard.ts
deliverWebhooks now logs single consolidated line per dispatch with stringified payload. updateMetaEnvelope and legacy updateMetaEnvelopeById webhook data now use result.mergedPayload ?? input.payload (full post-write state instead of input diff). VaultAccessGuard.validateToken caches JWKS per URL with TTL; checkAccess reuses cached context.tokenPayload. Both wrapped in timed() instrumentation.
Server Initialization & Rate Limiting
src/index.ts
Added createIdIndexes call during eVault startup. Fastify global rate-limiter now return reply after 429 response to prevent downstream handler execution.
Tests & Documentation
src/e2e/evault-core.e2e.spec.ts
Updated updateMetaEnvelopeById partial-update test to assert PATCH/merge semantics: fetched payload merges initial data with partial update rather than matching partial update alone.

Sequence Diagram

sequenceDiagram
participant Client
participant GraphQL
participant DBService
participant Neo4j
participant Webhook
Client->>GraphQL: updateMetaEnvelopeById(partialUpdate)
activate GraphQL
GraphQL->>DBService: updateMetaEnvelopeById(partialUpdate)
activate DBService
DBService->>Neo4j: session.executeWrite(tx => {...})
activate Neo4j
Neo4j->>Neo4j: Read existing envelopes
Neo4j->>Neo4j: Deduplicate by ontology
Neo4j->>Neo4j: Delete duplicate nodes (transaction)
Neo4j->>Neo4j: Update/Create envelopes via tx.run
Neo4j-->>DBService: Commit transaction
deactivate Neo4j
DBService->>DBService: Build mergedPayload (pre-existing + newly written)
DBService-->>GraphQL: Return {metaEnvelope, envelopes, mergedPayload}
deactivate DBService
GraphQL->>Webhook: deliverWebhooks(data: mergedPayload)
activate Webhook
Webhook->>Webhook: Log stringified payload with metadata
Webhook-->>GraphQL: Complete
deactivate Webhook
GraphQL-->>Client: Updated envelope with full post-write state
deactivate GraphQL
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

The refactoring involves dense transactional logic with careful state management (deduplication, PATCH semantics, merged payload construction), spans multiple interconnected files (db, types, graphql, auth), introduces new caching behavior, and requires verification that PATCH semantics and transactional integrity are correctly maintained across the read-modify-write cycle.

Possibly related PRs

Suggested labels

evault-refactor, database, transactional, performance-instrumentation, breaking-change

Suggested reviewers

  • sosweetham
  • xPathin

🐰 Transactional hops through the data warren,
PATCH semantics bloom where once was all-or-nothing,
Timers tick soft in the Neo4j burrow,
Full payloads emerge from the merged state—
A rabbit's reward for clean, careful writes.

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check nameStatusExplanationResolution
Description check⚠️ WarningThe description is incomplete. While it mentions JWKs caching (one optimization), it omits major changes: timing instrumentation, atomic transaction refactoring, database indexing, and webhook payload improvements. The 'How the change has been tested' section is blank.Provide a comprehensive description covering all key changes: JWKs caching, timing instrumentation, atomic transaction refactoring, database indexing, and webhook improvements. Specify how testing was performed.
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check nameStatusExplanation
Title check✅ PassedThe title focuses on optimizing CRUD performance, which aligns with the primary changes: adding timing instrumentation, JWKs caching, atomic transactions, and database indexing for performance improvements.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/evault-core-perf-optimization

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.

❤️ Share
Review rate limit: 0/1 reviews remaining, refill in 60 minutes.

Comment @coderabbitai help to get the list of available commands and usage tips.

@coodos
coodos marked this pull request as ready for review May 2, 2026 14:54
@coodos
coodos merged commit 2990789 into mainMay 2, 2026
5 of 6 checks passed
@coodos
coodos deleted the feat/evault-core-perf-optimization branch May 2, 2026 14:56
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@coodos
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: optmize evault CRUD performance - #951

Merged
coodos merged 10 commits into
mainfrom
feat/evault-core-perf-optimization
May 2, 2026
Merged

feat: optmize evault CRUD performance#951
coodos merged 10 commits into
mainfrom
feat/evault-core-perf-optimization

Conversation

@coodos

@coodoscoodos commented Apr 14, 2026

Copy link
Copy Markdown
Contributor

Description of change

Added JWKs caching to reduce latency

Issue Number

Type of change

  • Update (a change which updates existing functionality)

How the change has been tested

Change checklist

  • I have ensured that the CI Checks pass locally
  • I have removed any unnecessary logic
  • My code is well documented
  • I have signed my commits
  • My code follows the pattern of the application
  • I have self reviewed my code

Summary by CodeRabbit

  • New Features

    • Webhooks now deliver the complete post-write state of updated envelopes, preventing receivers from unintentionally overwriting fields with partial data.
  • Bug Fixes

    • Fixed rate-limiting to properly prevent further request handling after rejection.
  • Performance Improvements

    • Added database indexing on envelope identifiers for faster lookups.
    • Implemented JWKS caching with configurable TTL for token validation.
    • Added performance monitoring and instrumentation across critical operations.

@coderabbitai

coderabbitaiBot commented Apr 14, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

Pull request was closed or merged during review

📝 Walkthrough

Walkthrough

This PR introduces performance timing instrumentation, refactors database meta-envelope operations to use transactional PATCH semantics with merged payloads, adds Neo4j id-field indexes, implements JWKS caching in authentication, updates GraphQL webhooks to deliver full post-write state, and fixes rate-limiting response handling.

Changes

Database Refactoring & Timing Infrastructure

Layer / File(s)Summary
Timing Utility
src/core/utils/timing.ts
New timed() async wrapper measures operation duration, logs slow calls (threshold EVAULT_TIMING_SLOW_MS), and exposes newTraceId() and timingEnabled() utilities. Disabled when EVAULT_TIMING=0.
Database Query Instrumentation
src/core/db/db.service.ts (lines 45–53)
runQueryInternal wraps session lifecycle in timed(...) with Cypher label derived from the first line of the query.
Meta-Envelope Storage
src/core/db/db.service.ts (lines 81–140)
storeMetaEnvelope now wrapped in timed("db.storeMetaEnvelope", ...). ID generation timing and write operations are separately timed.
Meta-Envelope Update Transactional Refactor
src/core/db/db.service.ts (lines 541–698)
updateMetaEnvelopeById refactored to execute full read-modify-write cycle inside a single session.executeWrite transaction using tx.run. Envelope deduplication now happens within the transaction. PATCH semantics enforced: stale envelopes no longer deleted; mergedPayload returned combining pre-existing and newly written envelopes.
Database Type Updates
src/core/db/types.ts
StoreMetaEnvelopeResult gains optional mergedPayload?: Record<string, any> field. Documentation clarified: envelopes are touched envelopes; mergedPayload is the complete post-write meta-envelope state.
Neo4j ID Indexes Migration
src/core/db/migrations/add-id-indexes.ts
New migration module exports createIdIndexes(driver) to create range/point-lookup indexes on Envelope.id and MetaEnvelope.id with IF NOT EXISTS guards.
GraphQL Webhook & Authentication
src/core/protocol/graphql-server.ts, src/core/protocol/vault-access-guard.ts
deliverWebhooks now logs single consolidated line per dispatch with stringified payload. updateMetaEnvelope and legacy updateMetaEnvelopeById webhook data now use result.mergedPayload ?? input.payload (full post-write state instead of input diff). VaultAccessGuard.validateToken caches JWKS per URL with TTL; checkAccess reuses cached context.tokenPayload. Both wrapped in timed() instrumentation.
Server Initialization & Rate Limiting
src/index.ts
Added createIdIndexes call during eVault startup. Fastify global rate-limiter now return reply after 429 response to prevent downstream handler execution.
Tests & Documentation
src/e2e/evault-core.e2e.spec.ts
Updated updateMetaEnvelopeById partial-update test to assert PATCH/merge semantics: fetched payload merges initial data with partial update rather than matching partial update alone.

Sequence Diagram

sequenceDiagram
participant Client
participant GraphQL
participant DBService
participant Neo4j
participant Webhook
Client->>GraphQL: updateMetaEnvelopeById(partialUpdate)
activate GraphQL
GraphQL->>DBService: updateMetaEnvelopeById(partialUpdate)
activate DBService
DBService->>Neo4j: session.executeWrite(tx => {...})
activate Neo4j
Neo4j->>Neo4j: Read existing envelopes
Neo4j->>Neo4j: Deduplicate by ontology
Neo4j->>Neo4j: Delete duplicate nodes (transaction)
Neo4j->>Neo4j: Update/Create envelopes via tx.run
Neo4j-->>DBService: Commit transaction
deactivate Neo4j
DBService->>DBService: Build mergedPayload (pre-existing + newly written)
DBService-->>GraphQL: Return {metaEnvelope, envelopes, mergedPayload}
deactivate DBService
GraphQL->>Webhook: deliverWebhooks(data: mergedPayload)
activate Webhook
Webhook->>Webhook: Log stringified payload with metadata
Webhook-->>GraphQL: Complete
deactivate Webhook
GraphQL-->>Client: Updated envelope with full post-write state
deactivate GraphQL
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

The refactoring involves dense transactional logic with careful state management (deduplication, PATCH semantics, merged payload construction), spans multiple interconnected files (db, types, graphql, auth), introduces new caching behavior, and requires verification that PATCH semantics and transactional integrity are correctly maintained across the read-modify-write cycle.

Possibly related PRs

Suggested labels

evault-refactor, database, transactional, performance-instrumentation, breaking-change

Suggested reviewers

  • sosweetham
  • xPathin

🐰 Transactional hops through the data warren,
PATCH semantics bloom where once was all-or-nothing,
Timers tick soft in the Neo4j burrow,
Full payloads emerge from the merged state—
A rabbit's reward for clean, careful writes.

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check nameStatusExplanationResolution
Description check⚠️ WarningThe description is incomplete. While it mentions JWKs caching (one optimization), it omits major changes: timing instrumentation, atomic transaction refactoring, database indexing, and webhook payload improvements. The 'How the change has been tested' section is blank.Provide a comprehensive description covering all key changes: JWKs caching, timing instrumentation, atomic transaction refactoring, database indexing, and webhook improvements. Specify how testing was performed.
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check nameStatusExplanation
Title check✅ PassedThe title focuses on optimizing CRUD performance, which aligns with the primary changes: adding timing instrumentation, JWKs caching, atomic transactions, and database indexing for performance improvements.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/evault-core-perf-optimization

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.

❤️ Share
Review rate limit: 0/1 reviews remaining, refill in 60 minutes.

Comment @coderabbitai help to get the list of available commands and usage tips.

@coodos
coodos marked this pull request as ready for review May 2, 2026 14:54
@coodos
coodos merged commit 2990789 into mainMay 2, 2026
5 of 6 checks passed
@coodos
coodos deleted the feat/evault-core-perf-optimization branch May 2, 2026 14:56
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@coodos
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: optmize evault CRUD performance - #951

Merged
coodos merged 10 commits into
mainfrom
feat/evault-core-perf-optimization
May 2, 2026
Merged

feat: optmize evault CRUD performance#951
coodos merged 10 commits into
mainfrom
feat/evault-core-perf-optimization

Conversation

@coodos

@coodoscoodos commented Apr 14, 2026

Copy link
Copy Markdown
Contributor

Description of change

Added JWKs caching to reduce latency

Issue Number

Type of change

  • Update (a change which updates existing functionality)

How the change has been tested

Change checklist

  • I have ensured that the CI Checks pass locally
  • I have removed any unnecessary logic
  • My code is well documented
  • I have signed my commits
  • My code follows the pattern of the application
  • I have self reviewed my code

Summary by CodeRabbit

  • New Features

    • Webhooks now deliver the complete post-write state of updated envelopes, preventing receivers from unintentionally overwriting fields with partial data.
  • Bug Fixes

    • Fixed rate-limiting to properly prevent further request handling after rejection.
  • Performance Improvements

    • Added database indexing on envelope identifiers for faster lookups.
    • Implemented JWKS caching with configurable TTL for token validation.
    • Added performance monitoring and instrumentation across critical operations.

@coderabbitai

coderabbitaiBot commented Apr 14, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

Pull request was closed or merged during review

📝 Walkthrough

Walkthrough

This PR introduces performance timing instrumentation, refactors database meta-envelope operations to use transactional PATCH semantics with merged payloads, adds Neo4j id-field indexes, implements JWKS caching in authentication, updates GraphQL webhooks to deliver full post-write state, and fixes rate-limiting response handling.

Changes

Database Refactoring & Timing Infrastructure

Layer / File(s)Summary
Timing Utility
src/core/utils/timing.ts
New timed() async wrapper measures operation duration, logs slow calls (threshold EVAULT_TIMING_SLOW_MS), and exposes newTraceId() and timingEnabled() utilities. Disabled when EVAULT_TIMING=0.
Database Query Instrumentation
src/core/db/db.service.ts (lines 45–53)
runQueryInternal wraps session lifecycle in timed(...) with Cypher label derived from the first line of the query.
Meta-Envelope Storage
src/core/db/db.service.ts (lines 81–140)
storeMetaEnvelope now wrapped in timed("db.storeMetaEnvelope", ...). ID generation timing and write operations are separately timed.
Meta-Envelope Update Transactional Refactor
src/core/db/db.service.ts (lines 541–698)
updateMetaEnvelopeById refactored to execute full read-modify-write cycle inside a single session.executeWrite transaction using tx.run. Envelope deduplication now happens within the transaction. PATCH semantics enforced: stale envelopes no longer deleted; mergedPayload returned combining pre-existing and newly written envelopes.
Database Type Updates
src/core/db/types.ts
StoreMetaEnvelopeResult gains optional mergedPayload?: Record<string, any> field. Documentation clarified: envelopes are touched envelopes; mergedPayload is the complete post-write meta-envelope state.
Neo4j ID Indexes Migration
src/core/db/migrations/add-id-indexes.ts
New migration module exports createIdIndexes(driver) to create range/point-lookup indexes on Envelope.id and MetaEnvelope.id with IF NOT EXISTS guards.
GraphQL Webhook & Authentication
src/core/protocol/graphql-server.ts, src/core/protocol/vault-access-guard.ts
deliverWebhooks now logs single consolidated line per dispatch with stringified payload. updateMetaEnvelope and legacy updateMetaEnvelopeById webhook data now use result.mergedPayload ?? input.payload (full post-write state instead of input diff). VaultAccessGuard.validateToken caches JWKS per URL with TTL; checkAccess reuses cached context.tokenPayload. Both wrapped in timed() instrumentation.
Server Initialization & Rate Limiting
src/index.ts
Added createIdIndexes call during eVault startup. Fastify global rate-limiter now return reply after 429 response to prevent downstream handler execution.
Tests & Documentation
src/e2e/evault-core.e2e.spec.ts
Updated updateMetaEnvelopeById partial-update test to assert PATCH/merge semantics: fetched payload merges initial data with partial update rather than matching partial update alone.

Sequence Diagram

sequenceDiagram
participant Client
participant GraphQL
participant DBService
participant Neo4j
participant Webhook
Client->>GraphQL: updateMetaEnvelopeById(partialUpdate)
activate GraphQL
GraphQL->>DBService: updateMetaEnvelopeById(partialUpdate)
activate DBService
DBService->>Neo4j: session.executeWrite(tx => {...})
activate Neo4j
Neo4j->>Neo4j: Read existing envelopes
Neo4j->>Neo4j: Deduplicate by ontology
Neo4j->>Neo4j: Delete duplicate nodes (transaction)
Neo4j->>Neo4j: Update/Create envelopes via tx.run
Neo4j-->>DBService: Commit transaction
deactivate Neo4j
DBService->>DBService: Build mergedPayload (pre-existing + newly written)
DBService-->>GraphQL: Return {metaEnvelope, envelopes, mergedPayload}
deactivate DBService
GraphQL->>Webhook: deliverWebhooks(data: mergedPayload)
activate Webhook
Webhook->>Webhook: Log stringified payload with metadata
Webhook-->>GraphQL: Complete
deactivate Webhook
GraphQL-->>Client: Updated envelope with full post-write state
deactivate GraphQL
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

The refactoring involves dense transactional logic with careful state management (deduplication, PATCH semantics, merged payload construction), spans multiple interconnected files (db, types, graphql, auth), introduces new caching behavior, and requires verification that PATCH semantics and transactional integrity are correctly maintained across the read-modify-write cycle.

Possibly related PRs

Suggested labels

evault-refactor, database, transactional, performance-instrumentation, breaking-change

Suggested reviewers

  • sosweetham
  • xPathin

🐰 Transactional hops through the data warren,
PATCH semantics bloom where once was all-or-nothing,
Timers tick soft in the Neo4j burrow,
Full payloads emerge from the merged state—
A rabbit's reward for clean, careful writes.

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check nameStatusExplanationResolution
Description check⚠️ WarningThe description is incomplete. While it mentions JWKs caching (one optimization), it omits major changes: timing instrumentation, atomic transaction refactoring, database indexing, and webhook payload improvements. The 'How the change has been tested' section is blank.Provide a comprehensive description covering all key changes: JWKs caching, timing instrumentation, atomic transaction refactoring, database indexing, and webhook improvements. Specify how testing was performed.
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check nameStatusExplanation
Title check✅ PassedThe title focuses on optimizing CRUD performance, which aligns with the primary changes: adding timing instrumentation, JWKs caching, atomic transactions, and database indexing for performance improvements.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/evault-core-perf-optimization

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.

❤️ Share
Review rate limit: 0/1 reviews remaining, refill in 60 minutes.

Comment @coderabbitai help to get the list of available commands and usage tips.

@coodos
coodos marked this pull request as ready for review May 2, 2026 14:54
@coodos
coodos merged commit 2990789 into mainMay 2, 2026
5 of 6 checks passed
@coodos
coodos deleted the feat/evault-core-perf-optimization branch May 2, 2026 14:56
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@coodos
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat: optmize evault CRUD performance - #951

Merged
coodos merged 10 commits into
mainfrom
feat/evault-core-perf-optimization
May 2, 2026
Merged

feat: optmize evault CRUD performance#951
coodos merged 10 commits into
mainfrom
feat/evault-core-perf-optimization

Conversation

@coodos

@coodoscoodos commented Apr 14, 2026

Copy link
Copy Markdown
Contributor

Description of change

Added JWKs caching to reduce latency

Issue Number

Type of change

  • Update (a change which updates existing functionality)

How the change has been tested

Change checklist

  • I have ensured that the CI Checks pass locally
  • I have removed any unnecessary logic
  • My code is well documented
  • I have signed my commits
  • My code follows the pattern of the application
  • I have self reviewed my code

Summary by CodeRabbit

  • New Features

    • Webhooks now deliver the complete post-write state of updated envelopes, preventing receivers from unintentionally overwriting fields with partial data.
  • Bug Fixes

    • Fixed rate-limiting to properly prevent further request handling after rejection.
  • Performance Improvements

    • Added database indexing on envelope identifiers for faster lookups.
    • Implemented JWKS caching with configurable TTL for token validation.
    • Added performance monitoring and instrumentation across critical operations.

@coderabbitai

coderabbitaiBot commented Apr 14, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

Pull request was closed or merged during review

📝 Walkthrough

Walkthrough

This PR introduces performance timing instrumentation, refactors database meta-envelope operations to use transactional PATCH semantics with merged payloads, adds Neo4j id-field indexes, implements JWKS caching in authentication, updates GraphQL webhooks to deliver full post-write state, and fixes rate-limiting response handling.

Changes

Database Refactoring & Timing Infrastructure

Layer / File(s)Summary
Timing Utility
src/core/utils/timing.ts
New timed() async wrapper measures operation duration, logs slow calls (threshold EVAULT_TIMING_SLOW_MS), and exposes newTraceId() and timingEnabled() utilities. Disabled when EVAULT_TIMING=0.
Database Query Instrumentation
src/core/db/db.service.ts (lines 45–53)
runQueryInternal wraps session lifecycle in timed(...) with Cypher label derived from the first line of the query.
Meta-Envelope Storage
src/core/db/db.service.ts (lines 81–140)
storeMetaEnvelope now wrapped in timed("db.storeMetaEnvelope", ...). ID generation timing and write operations are separately timed.
Meta-Envelope Update Transactional Refactor
src/core/db/db.service.ts (lines 541–698)
updateMetaEnvelopeById refactored to execute full read-modify-write cycle inside a single session.executeWrite transaction using tx.run. Envelope deduplication now happens within the transaction. PATCH semantics enforced: stale envelopes no longer deleted; mergedPayload returned combining pre-existing and newly written envelopes.
Database Type Updates
src/core/db/types.ts
StoreMetaEnvelopeResult gains optional mergedPayload?: Record<string, any> field. Documentation clarified: envelopes are touched envelopes; mergedPayload is the complete post-write meta-envelope state.
Neo4j ID Indexes Migration
src/core/db/migrations/add-id-indexes.ts
New migration module exports createIdIndexes(driver) to create range/point-lookup indexes on Envelope.id and MetaEnvelope.id with IF NOT EXISTS guards.
GraphQL Webhook & Authentication
src/core/protocol/graphql-server.ts, src/core/protocol/vault-access-guard.ts
deliverWebhooks now logs single consolidated line per dispatch with stringified payload. updateMetaEnvelope and legacy updateMetaEnvelopeById webhook data now use result.mergedPayload ?? input.payload (full post-write state instead of input diff). VaultAccessGuard.validateToken caches JWKS per URL with TTL; checkAccess reuses cached context.tokenPayload. Both wrapped in timed() instrumentation.
Server Initialization & Rate Limiting
src/index.ts
Added createIdIndexes call during eVault startup. Fastify global rate-limiter now return reply after 429 response to prevent downstream handler execution.
Tests & Documentation
src/e2e/evault-core.e2e.spec.ts
Updated updateMetaEnvelopeById partial-update test to assert PATCH/merge semantics: fetched payload merges initial data with partial update rather than matching partial update alone.

Sequence Diagram

sequenceDiagram
participant Client
participant GraphQL
participant DBService
participant Neo4j
participant Webhook
Client->>GraphQL: updateMetaEnvelopeById(partialUpdate)
activate GraphQL
GraphQL->>DBService: updateMetaEnvelopeById(partialUpdate)
activate DBService
DBService->>Neo4j: session.executeWrite(tx => {...})
activate Neo4j
Neo4j->>Neo4j: Read existing envelopes
Neo4j->>Neo4j: Deduplicate by ontology
Neo4j->>Neo4j: Delete duplicate nodes (transaction)
Neo4j->>Neo4j: Update/Create envelopes via tx.run
Neo4j-->>DBService: Commit transaction
deactivate Neo4j
DBService->>DBService: Build mergedPayload (pre-existing + newly written)
DBService-->>GraphQL: Return {metaEnvelope, envelopes, mergedPayload}
deactivate DBService
GraphQL->>Webhook: deliverWebhooks(data: mergedPayload)
activate Webhook
Webhook->>Webhook: Log stringified payload with metadata
Webhook-->>GraphQL: Complete
deactivate Webhook
GraphQL-->>Client: Updated envelope with full post-write state
deactivate GraphQL
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

The refactoring involves dense transactional logic with careful state management (deduplication, PATCH semantics, merged payload construction), spans multiple interconnected files (db, types, graphql, auth), introduces new caching behavior, and requires verification that PATCH semantics and transactional integrity are correctly maintained across the read-modify-write cycle.

Possibly related PRs

Suggested labels

evault-refactor, database, transactional, performance-instrumentation, breaking-change

Suggested reviewers

  • sosweetham
  • xPathin

🐰 Transactional hops through the data warren,
PATCH semantics bloom where once was all-or-nothing,
Timers tick soft in the Neo4j burrow,
Full payloads emerge from the merged state—
A rabbit's reward for clean, careful writes.

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check nameStatusExplanationResolution
Description check⚠️ WarningThe description is incomplete. While it mentions JWKs caching (one optimization), it omits major changes: timing instrumentation, atomic transaction refactoring, database indexing, and webhook payload improvements. The 'How the change has been tested' section is blank.Provide a comprehensive description covering all key changes: JWKs caching, timing instrumentation, atomic transaction refactoring, database indexing, and webhook improvements. Specify how testing was performed.
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check nameStatusExplanation
Title check✅ PassedThe title focuses on optimizing CRUD performance, which aligns with the primary changes: adding timing instrumentation, JWKs caching, atomic transactions, and database indexing for performance improvements.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/evault-core-perf-optimization

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.

❤️ Share
Review rate limit: 0/1 reviews remaining, refill in 60 minutes.

Comment @coderabbitai help to get the list of available commands and usage tips.

@coodos
coodos marked this pull request as ready for review May 2, 2026 14:54
@coodos
coodos merged commit 2990789 into mainMay 2, 2026
5 of 6 checks passed
@coodos
coodos deleted the feat/evault-core-perf-optimization branch May 2, 2026 14:56
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@coodos
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: optmize evault CRUD performance - #951

Merged
coodos merged 10 commits into
mainfrom
feat/evault-core-perf-optimization
May 2, 2026
Merged

feat: optmize evault CRUD performance#951
coodos merged 10 commits into
mainfrom
feat/evault-core-perf-optimization

Conversation

@coodos

@coodoscoodos commented Apr 14, 2026

Copy link
Copy Markdown
Contributor

Description of change

Added JWKs caching to reduce latency

Issue Number

Type of change

  • Update (a change which updates existing functionality)

How the change has been tested

Change checklist

  • I have ensured that the CI Checks pass locally
  • I have removed any unnecessary logic
  • My code is well documented
  • I have signed my commits
  • My code follows the pattern of the application
  • I have self reviewed my code

Summary by CodeRabbit

  • New Features

    • Webhooks now deliver the complete post-write state of updated envelopes, preventing receivers from unintentionally overwriting fields with partial data.
  • Bug Fixes

    • Fixed rate-limiting to properly prevent further request handling after rejection.
  • Performance Improvements

    • Added database indexing on envelope identifiers for faster lookups.
    • Implemented JWKS caching with configurable TTL for token validation.
    • Added performance monitoring and instrumentation across critical operations.

@coderabbitai

coderabbitaiBot commented Apr 14, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

Pull request was closed or merged during review

📝 Walkthrough

Walkthrough

This PR introduces performance timing instrumentation, refactors database meta-envelope operations to use transactional PATCH semantics with merged payloads, adds Neo4j id-field indexes, implements JWKS caching in authentication, updates GraphQL webhooks to deliver full post-write state, and fixes rate-limiting response handling.

Changes

Database Refactoring & Timing Infrastructure

Layer / File(s)Summary
Timing Utility
src/core/utils/timing.ts
New timed() async wrapper measures operation duration, logs slow calls (threshold EVAULT_TIMING_SLOW_MS), and exposes newTraceId() and timingEnabled() utilities. Disabled when EVAULT_TIMING=0.
Database Query Instrumentation
src/core/db/db.service.ts (lines 45–53)
runQueryInternal wraps session lifecycle in timed(...) with Cypher label derived from the first line of the query.
Meta-Envelope Storage
src/core/db/db.service.ts (lines 81–140)
storeMetaEnvelope now wrapped in timed("db.storeMetaEnvelope", ...). ID generation timing and write operations are separately timed.
Meta-Envelope Update Transactional Refactor
src/core/db/db.service.ts (lines 541–698)
updateMetaEnvelopeById refactored to execute full read-modify-write cycle inside a single session.executeWrite transaction using tx.run. Envelope deduplication now happens within the transaction. PATCH semantics enforced: stale envelopes no longer deleted; mergedPayload returned combining pre-existing and newly written envelopes.
Database Type Updates
src/core/db/types.ts
StoreMetaEnvelopeResult gains optional mergedPayload?: Record<string, any> field. Documentation clarified: envelopes are touched envelopes; mergedPayload is the complete post-write meta-envelope state.
Neo4j ID Indexes Migration
src/core/db/migrations/add-id-indexes.ts
New migration module exports createIdIndexes(driver) to create range/point-lookup indexes on Envelope.id and MetaEnvelope.id with IF NOT EXISTS guards.
GraphQL Webhook & Authentication
src/core/protocol/graphql-server.ts, src/core/protocol/vault-access-guard.ts
deliverWebhooks now logs single consolidated line per dispatch with stringified payload. updateMetaEnvelope and legacy updateMetaEnvelopeById webhook data now use result.mergedPayload ?? input.payload (full post-write state instead of input diff). VaultAccessGuard.validateToken caches JWKS per URL with TTL; checkAccess reuses cached context.tokenPayload. Both wrapped in timed() instrumentation.
Server Initialization & Rate Limiting
src/index.ts
Added createIdIndexes call during eVault startup. Fastify global rate-limiter now return reply after 429 response to prevent downstream handler execution.
Tests & Documentation
src/e2e/evault-core.e2e.spec.ts
Updated updateMetaEnvelopeById partial-update test to assert PATCH/merge semantics: fetched payload merges initial data with partial update rather than matching partial update alone.

Sequence Diagram

sequenceDiagram
participant Client
participant GraphQL
participant DBService
participant Neo4j
participant Webhook
Client->>GraphQL: updateMetaEnvelopeById(partialUpdate)
activate GraphQL
GraphQL->>DBService: updateMetaEnvelopeById(partialUpdate)
activate DBService
DBService->>Neo4j: session.executeWrite(tx => {...})
activate Neo4j
Neo4j->>Neo4j: Read existing envelopes
Neo4j->>Neo4j: Deduplicate by ontology
Neo4j->>Neo4j: Delete duplicate nodes (transaction)
Neo4j->>Neo4j: Update/Create envelopes via tx.run
Neo4j-->>DBService: Commit transaction
deactivate Neo4j
DBService->>DBService: Build mergedPayload (pre-existing + newly written)
DBService-->>GraphQL: Return {metaEnvelope, envelopes, mergedPayload}
deactivate DBService
GraphQL->>Webhook: deliverWebhooks(data: mergedPayload)
activate Webhook
Webhook->>Webhook: Log stringified payload with metadata
Webhook-->>GraphQL: Complete
deactivate Webhook
GraphQL-->>Client: Updated envelope with full post-write state
deactivate GraphQL
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

The refactoring involves dense transactional logic with careful state management (deduplication, PATCH semantics, merged payload construction), spans multiple interconnected files (db, types, graphql, auth), introduces new caching behavior, and requires verification that PATCH semantics and transactional integrity are correctly maintained across the read-modify-write cycle.

Possibly related PRs

Suggested labels

evault-refactor, database, transactional, performance-instrumentation, breaking-change

Suggested reviewers

  • sosweetham
  • xPathin

🐰 Transactional hops through the data warren,
PATCH semantics bloom where once was all-or-nothing,
Timers tick soft in the Neo4j burrow,
Full payloads emerge from the merged state—
A rabbit's reward for clean, careful writes.

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check nameStatusExplanationResolution
Description check⚠️ WarningThe description is incomplete. While it mentions JWKs caching (one optimization), it omits major changes: timing instrumentation, atomic transaction refactoring, database indexing, and webhook payload improvements. The 'How the change has been tested' section is blank.Provide a comprehensive description covering all key changes: JWKs caching, timing instrumentation, atomic transaction refactoring, database indexing, and webhook improvements. Specify how testing was performed.
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check nameStatusExplanation
Title check✅ PassedThe title focuses on optimizing CRUD performance, which aligns with the primary changes: adding timing instrumentation, JWKs caching, atomic transactions, and database indexing for performance improvements.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/evault-core-perf-optimization

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.

❤️ Share
Review rate limit: 0/1 reviews remaining, refill in 60 minutes.

Comment @coderabbitai help to get the list of available commands and usage tips.

@coodos
coodos marked this pull request as ready for review May 2, 2026 14:54
@coodos
coodos merged commit 2990789 into mainMay 2, 2026
5 of 6 checks passed
@coodos
coodos deleted the feat/evault-core-perf-optimization branch May 2, 2026 14:56
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@coodos
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: optmize evault CRUD performance - #951

Merged
coodos merged 10 commits into
mainfrom
feat/evault-core-perf-optimization
May 2, 2026
Merged

feat: optmize evault CRUD performance#951
coodos merged 10 commits into
mainfrom
feat/evault-core-perf-optimization

Conversation

@coodos

@coodoscoodos commented Apr 14, 2026

Copy link
Copy Markdown
Contributor

Description of change

Added JWKs caching to reduce latency

Issue Number

Type of change

  • Update (a change which updates existing functionality)

How the change has been tested

Change checklist

  • I have ensured that the CI Checks pass locally
  • I have removed any unnecessary logic
  • My code is well documented
  • I have signed my commits
  • My code follows the pattern of the application
  • I have self reviewed my code

Summary by CodeRabbit

  • New Features

    • Webhooks now deliver the complete post-write state of updated envelopes, preventing receivers from unintentionally overwriting fields with partial data.
  • Bug Fixes

    • Fixed rate-limiting to properly prevent further request handling after rejection.
  • Performance Improvements

    • Added database indexing on envelope identifiers for faster lookups.
    • Implemented JWKS caching with configurable TTL for token validation.
    • Added performance monitoring and instrumentation across critical operations.

@coderabbitai

coderabbitaiBot commented Apr 14, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

Pull request was closed or merged during review

📝 Walkthrough

Walkthrough

This PR introduces performance timing instrumentation, refactors database meta-envelope operations to use transactional PATCH semantics with merged payloads, adds Neo4j id-field indexes, implements JWKS caching in authentication, updates GraphQL webhooks to deliver full post-write state, and fixes rate-limiting response handling.

Changes

Database Refactoring & Timing Infrastructure

Layer / File(s)Summary
Timing Utility
src/core/utils/timing.ts
New timed() async wrapper measures operation duration, logs slow calls (threshold EVAULT_TIMING_SLOW_MS), and exposes newTraceId() and timingEnabled() utilities. Disabled when EVAULT_TIMING=0.
Database Query Instrumentation
src/core/db/db.service.ts (lines 45–53)
runQueryInternal wraps session lifecycle in timed(...) with Cypher label derived from the first line of the query.
Meta-Envelope Storage
src/core/db/db.service.ts (lines 81–140)
storeMetaEnvelope now wrapped in timed("db.storeMetaEnvelope", ...). ID generation timing and write operations are separately timed.
Meta-Envelope Update Transactional Refactor
src/core/db/db.service.ts (lines 541–698)
updateMetaEnvelopeById refactored to execute full read-modify-write cycle inside a single session.executeWrite transaction using tx.run. Envelope deduplication now happens within the transaction. PATCH semantics enforced: stale envelopes no longer deleted; mergedPayload returned combining pre-existing and newly written envelopes.
Database Type Updates
src/core/db/types.ts
StoreMetaEnvelopeResult gains optional mergedPayload?: Record<string, any> field. Documentation clarified: envelopes are touched envelopes; mergedPayload is the complete post-write meta-envelope state.
Neo4j ID Indexes Migration
src/core/db/migrations/add-id-indexes.ts
New migration module exports createIdIndexes(driver) to create range/point-lookup indexes on Envelope.id and MetaEnvelope.id with IF NOT EXISTS guards.
GraphQL Webhook & Authentication
src/core/protocol/graphql-server.ts, src/core/protocol/vault-access-guard.ts
deliverWebhooks now logs single consolidated line per dispatch with stringified payload. updateMetaEnvelope and legacy updateMetaEnvelopeById webhook data now use result.mergedPayload ?? input.payload (full post-write state instead of input diff). VaultAccessGuard.validateToken caches JWKS per URL with TTL; checkAccess reuses cached context.tokenPayload. Both wrapped in timed() instrumentation.
Server Initialization & Rate Limiting
src/index.ts
Added createIdIndexes call during eVault startup. Fastify global rate-limiter now return reply after 429 response to prevent downstream handler execution.
Tests & Documentation
src/e2e/evault-core.e2e.spec.ts
Updated updateMetaEnvelopeById partial-update test to assert PATCH/merge semantics: fetched payload merges initial data with partial update rather than matching partial update alone.

Sequence Diagram

sequenceDiagram
participant Client
participant GraphQL
participant DBService
participant Neo4j
participant Webhook
Client->>GraphQL: updateMetaEnvelopeById(partialUpdate)
activate GraphQL
GraphQL->>DBService: updateMetaEnvelopeById(partialUpdate)
activate DBService
DBService->>Neo4j: session.executeWrite(tx => {...})
activate Neo4j
Neo4j->>Neo4j: Read existing envelopes
Neo4j->>Neo4j: Deduplicate by ontology
Neo4j->>Neo4j: Delete duplicate nodes (transaction)
Neo4j->>Neo4j: Update/Create envelopes via tx.run
Neo4j-->>DBService: Commit transaction
deactivate Neo4j
DBService->>DBService: Build mergedPayload (pre-existing + newly written)
DBService-->>GraphQL: Return {metaEnvelope, envelopes, mergedPayload}
deactivate DBService
GraphQL->>Webhook: deliverWebhooks(data: mergedPayload)
activate Webhook
Webhook->>Webhook: Log stringified payload with metadata
Webhook-->>GraphQL: Complete
deactivate Webhook
GraphQL-->>Client: Updated envelope with full post-write state
deactivate GraphQL
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

The refactoring involves dense transactional logic with careful state management (deduplication, PATCH semantics, merged payload construction), spans multiple interconnected files (db, types, graphql, auth), introduces new caching behavior, and requires verification that PATCH semantics and transactional integrity are correctly maintained across the read-modify-write cycle.

Possibly related PRs

Suggested labels

evault-refactor, database, transactional, performance-instrumentation, breaking-change

Suggested reviewers

  • sosweetham
  • xPathin

🐰 Transactional hops through the data warren,
PATCH semantics bloom where once was all-or-nothing,
Timers tick soft in the Neo4j burrow,
Full payloads emerge from the merged state—
A rabbit's reward for clean, careful writes.

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check nameStatusExplanationResolution
Description check⚠️ WarningThe description is incomplete. While it mentions JWKs caching (one optimization), it omits major changes: timing instrumentation, atomic transaction refactoring, database indexing, and webhook payload improvements. The 'How the change has been tested' section is blank.Provide a comprehensive description covering all key changes: JWKs caching, timing instrumentation, atomic transaction refactoring, database indexing, and webhook improvements. Specify how testing was performed.
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check nameStatusExplanation
Title check✅ PassedThe title focuses on optimizing CRUD performance, which aligns with the primary changes: adding timing instrumentation, JWKs caching, atomic transactions, and database indexing for performance improvements.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/evault-core-perf-optimization

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.

❤️ Share
Review rate limit: 0/1 reviews remaining, refill in 60 minutes.

Comment @coderabbitai help to get the list of available commands and usage tips.

@coodos
coodos marked this pull request as ready for review May 2, 2026 14:54
@coodos
coodos merged commit 2990789 into mainMay 2, 2026
5 of 6 checks passed
@coodos
coodos deleted the feat/evault-core-perf-optimization branch May 2, 2026 14:56
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@coodos
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat: optmize evault CRUD performance - #951

Merged
coodos merged 10 commits into
mainfrom
feat/evault-core-perf-optimization
May 2, 2026
Merged

feat: optmize evault CRUD performance#951
coodos merged 10 commits into
mainfrom
feat/evault-core-perf-optimization

Conversation

@coodos

@coodoscoodos commented Apr 14, 2026

Copy link
Copy Markdown
Contributor

Description of change

Added JWKs caching to reduce latency

Issue Number

Type of change

  • Update (a change which updates existing functionality)

How the change has been tested

Change checklist

  • I have ensured that the CI Checks pass locally
  • I have removed any unnecessary logic
  • My code is well documented
  • I have signed my commits
  • My code follows the pattern of the application
  • I have self reviewed my code

Summary by CodeRabbit

  • New Features

    • Webhooks now deliver the complete post-write state of updated envelopes, preventing receivers from unintentionally overwriting fields with partial data.
  • Bug Fixes

    • Fixed rate-limiting to properly prevent further request handling after rejection.
  • Performance Improvements

    • Added database indexing on envelope identifiers for faster lookups.
    • Implemented JWKS caching with configurable TTL for token validation.
    • Added performance monitoring and instrumentation across critical operations.

@coderabbitai

coderabbitaiBot commented Apr 14, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

Pull request was closed or merged during review

📝 Walkthrough

Walkthrough

This PR introduces performance timing instrumentation, refactors database meta-envelope operations to use transactional PATCH semantics with merged payloads, adds Neo4j id-field indexes, implements JWKS caching in authentication, updates GraphQL webhooks to deliver full post-write state, and fixes rate-limiting response handling.

Changes

Database Refactoring & Timing Infrastructure

Layer / File(s)Summary
Timing Utility
src/core/utils/timing.ts
New timed() async wrapper measures operation duration, logs slow calls (threshold EVAULT_TIMING_SLOW_MS), and exposes newTraceId() and timingEnabled() utilities. Disabled when EVAULT_TIMING=0.
Database Query Instrumentation
src/core/db/db.service.ts (lines 45–53)
runQueryInternal wraps session lifecycle in timed(...) with Cypher label derived from the first line of the query.
Meta-Envelope Storage
src/core/db/db.service.ts (lines 81–140)
storeMetaEnvelope now wrapped in timed("db.storeMetaEnvelope", ...). ID generation timing and write operations are separately timed.
Meta-Envelope Update Transactional Refactor
src/core/db/db.service.ts (lines 541–698)
updateMetaEnvelopeById refactored to execute full read-modify-write cycle inside a single session.executeWrite transaction using tx.run. Envelope deduplication now happens within the transaction. PATCH semantics enforced: stale envelopes no longer deleted; mergedPayload returned combining pre-existing and newly written envelopes.
Database Type Updates
src/core/db/types.ts
StoreMetaEnvelopeResult gains optional mergedPayload?: Record<string, any> field. Documentation clarified: envelopes are touched envelopes; mergedPayload is the complete post-write meta-envelope state.
Neo4j ID Indexes Migration
src/core/db/migrations/add-id-indexes.ts
New migration module exports createIdIndexes(driver) to create range/point-lookup indexes on Envelope.id and MetaEnvelope.id with IF NOT EXISTS guards.
GraphQL Webhook & Authentication
src/core/protocol/graphql-server.ts, src/core/protocol/vault-access-guard.ts
deliverWebhooks now logs single consolidated line per dispatch with stringified payload. updateMetaEnvelope and legacy updateMetaEnvelopeById webhook data now use result.mergedPayload ?? input.payload (full post-write state instead of input diff). VaultAccessGuard.validateToken caches JWKS per URL with TTL; checkAccess reuses cached context.tokenPayload. Both wrapped in timed() instrumentation.
Server Initialization & Rate Limiting
src/index.ts
Added createIdIndexes call during eVault startup. Fastify global rate-limiter now return reply after 429 response to prevent downstream handler execution.
Tests & Documentation
src/e2e/evault-core.e2e.spec.ts
Updated updateMetaEnvelopeById partial-update test to assert PATCH/merge semantics: fetched payload merges initial data with partial update rather than matching partial update alone.

Sequence Diagram

sequenceDiagram
participant Client
participant GraphQL
participant DBService
participant Neo4j
participant Webhook
Client->>GraphQL: updateMetaEnvelopeById(partialUpdate)
activate GraphQL
GraphQL->>DBService: updateMetaEnvelopeById(partialUpdate)
activate DBService
DBService->>Neo4j: session.executeWrite(tx => {...})
activate Neo4j
Neo4j->>Neo4j: Read existing envelopes
Neo4j->>Neo4j: Deduplicate by ontology
Neo4j->>Neo4j: Delete duplicate nodes (transaction)
Neo4j->>Neo4j: Update/Create envelopes via tx.run
Neo4j-->>DBService: Commit transaction
deactivate Neo4j
DBService->>DBService: Build mergedPayload (pre-existing + newly written)
DBService-->>GraphQL: Return {metaEnvelope, envelopes, mergedPayload}
deactivate DBService
GraphQL->>Webhook: deliverWebhooks(data: mergedPayload)
activate Webhook
Webhook->>Webhook: Log stringified payload with metadata
Webhook-->>GraphQL: Complete
deactivate Webhook
GraphQL-->>Client: Updated envelope with full post-write state
deactivate GraphQL
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

The refactoring involves dense transactional logic with careful state management (deduplication, PATCH semantics, merged payload construction), spans multiple interconnected files (db, types, graphql, auth), introduces new caching behavior, and requires verification that PATCH semantics and transactional integrity are correctly maintained across the read-modify-write cycle.

Possibly related PRs

Suggested labels

evault-refactor, database, transactional, performance-instrumentation, breaking-change

Suggested reviewers

  • sosweetham
  • xPathin

🐰 Transactional hops through the data warren,
PATCH semantics bloom where once was all-or-nothing,
Timers tick soft in the Neo4j burrow,
Full payloads emerge from the merged state—
A rabbit's reward for clean, careful writes.

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check nameStatusExplanationResolution
Description check⚠️ WarningThe description is incomplete. While it mentions JWKs caching (one optimization), it omits major changes: timing instrumentation, atomic transaction refactoring, database indexing, and webhook payload improvements. The 'How the change has been tested' section is blank.Provide a comprehensive description covering all key changes: JWKs caching, timing instrumentation, atomic transaction refactoring, database indexing, and webhook improvements. Specify how testing was performed.
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check nameStatusExplanation
Title check✅ PassedThe title focuses on optimizing CRUD performance, which aligns with the primary changes: adding timing instrumentation, JWKs caching, atomic transactions, and database indexing for performance improvements.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/evault-core-perf-optimization

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.

❤️ Share
Review rate limit: 0/1 reviews remaining, refill in 60 minutes.

Comment @coderabbitai help to get the list of available commands and usage tips.

@coodos
coodos marked this pull request as ready for review May 2, 2026 14:54
@coodos
coodos merged commit 2990789 into mainMay 2, 2026
5 of 6 checks passed
@coodos
coodos deleted the feat/evault-core-perf-optimization branch May 2, 2026 14:56
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@coodos