| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
feat: connection-level webhook url override (#6639) ### What Lets a single connection override the environment-wide webhook URLs with its own URL. Useful for routing one connection's sync/auth webhooks somewhere specific (e.g. a dev tunnel) without changing the shared environment endpoint. Works for all auth types, settable via the REST API, the connect SDK, or the dashboard's "Create connection" overrides. ### How Added `webhook_url ` to `ConnectionConfig`. This config is set at session creation time. We validate it just like the environment-level webhook urls (valid url that is not in our deny list). OAuth already merges connect-session `connection_config` defaults server-side; non-OAuth flows historically ignored them and only read request `params`. Had to tweak non-OAuth to do the same as OAuth: apply `connection_config` from the session on top of the ones from `params`. The session values intentionally override the `params`, since the session is the one created by the trusted actor. We only allow setting `webhook_url` at session creation, we ignore it from the `params` (because it's untrusted at that point). ### Usage Via sdk: ```ts const session = await nango.createConnectSession({ end_user: { id: 'user-123' }, allowed_integrations: ['my-integration'], integrations_config_defaults: { 'my-integration': { connection_config: { webhook_url: 'https://my-app.dev/nango-webhooks', webhook_url_secondary: 'https://my-app.dev/nango-webhooks-2' // optional } } } }); ``` In dashboard: <img width="1672" height="1478" alt="Kapture 2026-06-23 at 23 17 46" src="https://github.com/user-attachments/assets/e8193201-a538-420e-86f0-d67ecb645816" /> <!-- This is an auto-generated description by cubic. --> <a href="https://cubic.dev/pr/NangoHQ/nango/pull/6639?utm_source=github" target="_blank" rel="noopener noreferrer" data-no-image-dialog="true"><picture><source media="(prefers-color-scheme: dark)" srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img alt="Review in cubic" src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a> <!-- End of auto-generated description by cubic. --> | 2 个月前 | |
feat: move webhook_url override to top-level field. (#6778) > This is a breaking change with low surface impact After a lot of discussion we believe that `connection_config` was not the right place for `webhook_url`. We are trying to move quick while it's still not massively adopted (currently 2 accounts, using it incorrectly as the main `webhook_url` setting). This moves the setting to a top-level property on the connection called `webhook_url_override`. I also considered moving it to `overrides` on the connect_session, but the `overrides` object is keyed by integration, which doesn't really make sense for `webhook_url`. So I'm proposing this top-level alternative instead. Please look at the docs updates to understand the user-level change. --------- Co-authored-by: Cursor <cursoragent@cursor.com> | 1 个月前 | |
feat(server): Connection deleted webhook (#7235) <!-- Describe the problem and your solution --> Adds connection webhook deletion so customers can take appropriate cleanup actions on a connection deletion event <!-- Issue ticket number and link (if applicable) --> [NAN-5591: feat(server): Connection deleted webhook](https://linear.app/nango/issue/NAN-5591/featserver-connection-deleted-webhook) <!-- Testing instructions (skip if just adding/editing providers) --> 1. Configure your webhooks locally to point somewhere like [webhook.site](https://webhook.site/) or a local server for testing 2. Create a new connection if required 3. Delete connection 4. Receive webhook: { "operation": "deletion", "success": true, "type": "auth", ... } 5. Check log for associated entry <!-- This is an auto-generated description by cubic. --> <a href="https://cubic.dev/pr/NangoHQ/nango/pull/7235?utm_source=github" target="_blank" rel="noopener noreferrer" data-no-image-dialog="true"><picture><source media="(prefers-color-scheme: dark)" srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img alt="Review in cubic" src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a> <!-- End of auto-generated description by cubic. --> --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> | 10 天前 | |
feat(server): Connection deleted webhook (#7235) <!-- Describe the problem and your solution --> Adds connection webhook deletion so customers can take appropriate cleanup actions on a connection deletion event <!-- Issue ticket number and link (if applicable) --> [NAN-5591: feat(server): Connection deleted webhook](https://linear.app/nango/issue/NAN-5591/featserver-connection-deleted-webhook) <!-- Testing instructions (skip if just adding/editing providers) --> 1. Configure your webhooks locally to point somewhere like [webhook.site](https://webhook.site/) or a local server for testing 2. Create a new connection if required 3. Delete connection 4. Receive webhook: { "operation": "deletion", "success": true, "type": "auth", ... } 5. Check log for associated entry <!-- This is an auto-generated description by cubic. --> <a href="https://cubic.dev/pr/NangoHQ/nango/pull/7235?utm_source=github" target="_blank" rel="noopener noreferrer" data-no-image-dialog="true"><picture><source media="(prefers-color-scheme: dark)" srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img alt="Review in cubic" src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a> <!-- End of auto-generated description by cubic. --> --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> | 10 天前 | |
feat(server): Connection deleted webhook (#7235) <!-- Describe the problem and your solution --> Adds connection webhook deletion so customers can take appropriate cleanup actions on a connection deletion event <!-- Issue ticket number and link (if applicable) --> [NAN-5591: feat(server): Connection deleted webhook](https://linear.app/nango/issue/NAN-5591/featserver-connection-deleted-webhook) <!-- Testing instructions (skip if just adding/editing providers) --> 1. Configure your webhooks locally to point somewhere like [webhook.site](https://webhook.site/) or a local server for testing 2. Create a new connection if required 3. Delete connection 4. Receive webhook: { "operation": "deletion", "success": true, "type": "auth", ... } 5. Check log for associated entry <!-- This is an auto-generated description by cubic. --> <a href="https://cubic.dev/pr/NangoHQ/nango/pull/7235?utm_source=github" target="_blank" rel="noopener noreferrer" data-no-image-dialog="true"><picture><source media="(prefers-color-scheme: dark)" srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img alt="Review in cubic" src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a> <!-- End of auto-generated description by cubic. --> --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> | 10 天前 | |
perf(ci): amortize module imports in integration tests (NAN-6488) (#6970) The integration suite is the only thing on the critical path for PR runs and the merge queue. It takes 24 to 28 minutes while every other check finishes in 2 to 9 minutes. Almost none of that was test execution. Vitest reported 63.5 minutes of `import` against 5.8 minutes of `tests`, because `pool: 'forks'` with the default `isolate: true` gives every file a fresh process that re-imports the whole @nangohq graph. Workspace packages are symlinked into node_modules, so vitest does not externalize them and pushes all of `packages/*/dist` through its module runner each time. A recycled worker never released those graphs either, since module level singletons keep them alive, so memory climbed across a shard. ## What this changes **`isolate: false` for the bulk of the suite.** The import becomes a one time cost per shard. Safe because these tests are already serial through `maxWorkers: 1` and already share Postgres and Elasticsearch, so a process per file was not adding isolation they did not already lack. **A second fileset with `isolate: true`** for the two groups that genuinely need their own process, sharing the same containers: - the four files using `vi.mock`, which only intercepts a module that has not been imported yet - the scheduler and orchestrator suites, which run live polling daemons against the fixed `scheduler` schema. Orchestrator counts because its harness builds a `Scheduler` on `getTestDbClient` from @nangohq/scheduler, which pins that schema **One PBKDF2 constant**, dropping to a single iteration under vitest. Seeding an account derives four keys at 310k iterations (`user.seeder`, `secret.service`, and `customerKey.service` twice for the API key and webhook signing key), which dominated what CPU time was left. Gated on `VITEST` rather than an env var so no deployment configuration can weaken password hashing. All ten call sites now read the same constant, so write and verify paths cannot drift. **Test hygiene that sharing a process required.** Nine files restore `envs.NANGO_LOGS_ENABLED`, capturing it at declaration so a failing `beforeAll` cannot write `undefined` back. Five restore their module level `vi.spyOn(syncManager, ...)`. Three stop disconnecting the process wide client from `getRedis`, which `RedisKVStore.destroy()` is already a no-op for the same reason. One timestamp assertion gets more than a 2ms margin. ## Results Measured on CI, `blacksmith-4vcpu-ubuntu-2404`. | | before | after | |---|---|---| | tests workflow total | 25 to 28m | **17.8m** | | slowest integration shard | 25.4m | **5.3m** | | shard spread | 12.0 to 25.4m | 3.8 to 5.3m | Per shard, from vitest's own `Duration` line (shard 2): | | before | after | |---|---|---| | `import` | 831s | **148.7s** | | `tests` | 46.4s | **23.9s** | | total | 914s | **202.7s** | The `import` drop is `isolate: false`. The `tests` drop is the PBKDF2 constant. `tests-unit` at 14.3m now gates the workflow rather than integration. ## Scope No CI workflow changes. Shards stay at 4: with `isolate: false` each shard runs its files in one process, so fewer files per shard means a lower memory ceiling, and that headroom is worth more than the CI minutes. Production behaviour is unchanged apart from the PBKDF2 constant, which resolves to the current 310000 outside vitest. ## Known flakiness, pre-existing `scheduling`, `scheduler` and `models/tasks` in `packages/scheduler` are already flaky on master. Running those suites three times on an unmodified checkout gave 6 failures, then 0, then 0. Recent full runs here land at 0 to 2 failures, always inside that group. Not introduced by this PR and not fixed by it, so do not read a single green run as proof. Worth its own ticket. ## Follow ups - `getRedis` leaves a closed client in its cache, so a dropped connection permanently poisons that key. Real bug, reverted out of this PR to keep it test side. Cubic also flagged a single flight race on the same function. - The unit test job has the same shape, `import 1890s` against `tests 21.6s`. Related to NAN-6026. ## Test plan - [ ] `tests-integration` green in CI - [ ] confirm the wall clock drop on a merge queue run - [ ] confirm peak memory per shard is sane - [ ] password login, signup and reset still pass, since PBKDF2 call sites moved | 1 个月前 | |
revert: "revert: "fix(redis): harden redis usage to tolerate connection issues"" (#6521) Reverts NangoHQ/nango#6514 Enable RESP3 for all Redis clients created via getRedisClientOptions, fixing pub/sub reliability under node-redis v5 and aligning types across the codebase. node-redis v5 defaults to RESP2, which mishandles pub/sub status replies (subscribe/unsubscribe acks) and can throw when the command queue is empty. RESP3 routes pub/sub through a dedicated push handler and supports re-authentication on active subscriber connections — both needed for the server's Redis publisher/subscriber clients. Changes - packages/kvstore/lib/redisClient.ts — set RESP: 3 in getRedisClientOptions (shared by kvstore, publisher, rate limiter, jobs runner, etc.) - NangoRedisClient type — RedisClientType<..., 3> exported from kvstore so callers (getRedis, RedisKVStore, publisher.client.ts) type-check without casts - packages/kvstore/lib/redisClient.integration.test.ts — update the no-password auth test for RESP3 semantics: auth failure happens at HELLO during connect(), not on the first command | 2 个月前 | |
revert: "revert: "fix(redis): harden redis usage to tolerate connection issues"" (#6521) Reverts NangoHQ/nango#6514 Enable RESP3 for all Redis clients created via getRedisClientOptions, fixing pub/sub reliability under node-redis v5 and aligning types across the codebase. node-redis v5 defaults to RESP2, which mishandles pub/sub status replies (subscribe/unsubscribe acks) and can throw when the command queue is empty. RESP3 routes pub/sub through a dedicated push handler and supports re-authentication on active subscriber connections — both needed for the server's Redis publisher/subscriber clients. Changes - packages/kvstore/lib/redisClient.ts — set RESP: 3 in getRedisClientOptions (shared by kvstore, publisher, rate limiter, jobs runner, etc.) - NangoRedisClient type — RedisClientType<..., 3> exported from kvstore so callers (getRedis, RedisKVStore, publisher.client.ts) type-check without casts - packages/kvstore/lib/redisClient.integration.test.ts — update the no-password auth test for RESP3 semantics: auth failure happens at HELLO during connect(), not on the first command | 2 个月前 | |
chore(webhooks): add circuit breaker (#5061) Adding a circuit breaker mechanism to fail quickly when a customer webhook endpoint is unresponsive (timeouts/errors). The goal is to protect Nango services when a customer webhook endpoint is down. It affects all webhooks delivered to customers, including sync webhooks, not just webhook forwarding. Using `rate-limiter-flexible` library and redis, which is used in other part of the stack, to keep track of the failure rate for each endpoint. When requests for a given endpoint fail beyond the threshold, Nango will skip making the requests and fail the webhook delivery quickly. After a cooldown period Nango will let at least one request go through. If recovery requests are successful, the circuit breaker will be closed and delivering the webhook will be attempted again for the url. If recovery requests failed, delivery of webhooks for this url will be stopped again until a new cooldown period ends. This commit is also lowering the timeout of the webhook delivery requests to 20s (from 60s) and the number of retry attempt to 2 (previously 7) This is not introducing any queuing mechanism and a large amount of webhook deliveries might still be attempted before the circuit breaker open. (if for example the customer endpoint is slow to respond). It would still provide some protection by stopping outgoing requests once the 20s timeouts elapsed and won't allow a large amount of requests until the endpoint responds with success again). It could however introduce a seesaw behavior if the heavy loads is sustained and the customer endpoints slow down under load but recover quickly. Not perfect but better than no protection at at like we have today <!-- Summary by @propel-code-bot --> --- **Webhook delivery circuit-breaker with Redis + timeout/retry tuning** Introduces a Redis-backed circuit breaker that halts outbound webhook calls after repeated failures and automatically probes for recovery. The breaker is injected into the existing webhook delivery flow, lowers default request timeout to 20 s, reduces retry attempts from 7 to 2, and makes all thresholds configurable through new environment variables. Extensive vitest coverage validates CLOSED/OPEN/HALF_OPEN transitions and auto-reset behavior. Supporting changes span env parsing, dependency graph, and test updates. <details> <summary><strong>Key Changes</strong></summary> • Added `packages/webhooks/lib/circuitBreaker.ts` implementing `CircuitBreakerRedis` and `CircuitBreakerPassThrough` with failure counting via `rate-limiter-flexible` and Redis TTL-backed state • Integrated breaker into `packages/webhooks/lib/utils.ts` (`deliver()`): calls now wrapped in `circuitBreaker.execute()`; new timeout and adjusted retry logic • Added env schema knobs (`NANGO_WEBHOOK_TIMEOUT_MS`, `NANGO_WEBHOOK_RETRY_ATTEMPTS`, `NANGO_WEBHOOK_CIRCUIT_BREAKER_*`) in `packages/utils/lib/environment/parse.ts` • Lazy breaker instantiation with Redis fallback to pass-through when `NANGO_REDIS_URL` is undefined • Extensive integration test `packages/webhooks/lib/circuitBreaker.integration.test.ts` (≈280 LOC) covering all state transitions incl. auto-reset and key isolation • Updated unit tests (`asyncAction.unit.test.ts`) to reflect new timeout param • Dependency additions: `rate-limiter-flexible`, `@nangohq/kvstore`; tsconfig path updates; lockfile regeneration </details> <details> <summary><strong>Affected Areas</strong></summary> • `packages/webhooks/lib/circuitBreaker.ts` • `packages/webhooks/lib/utils.ts` • `packages/utils/lib/environment/parse.ts` • `packages/webhooks/lib/envs.ts` • Webhook integration/unit tests • Package manifests and `tsconfig` references </details> --- *This summary was automatically generated by @propel-code-bot* | 9 个月前 | |
fix(webhooks): enforce signature validation in webhook routing scripts (#7430) NAN-6909 Audits every webhook routing script and enforces signature validation wherever it can be enforced without breaking an existing user contract. PagerDuty verified the signature after dispatching to the customer scripts, so a forged webhook ran them before being rejected. Slack had no verification at all. Checkr logged that verification failed and processed the webhook anyway. All three reject now. GitHub App is handled separately. Signature comparisons are length safe across the board, so a malformed signature returns 401 instead of throwing a 500. HubSpot, Shopify, ConnectWise and Gmail had guards that could not fire or crashed on missing input. The HMAC and Svix verification that was copied across providers moves into a shared signature.ts. Folk now uses the connection metadata secret that PagerDuty and GitLab already use, with the integration level secret still working for single connection integrations. Where a provider supports verification but no secret is configured we still let the webhook through, and now write a warning to the customer operation logs saying their traffic is unverified. Adds webhook_user_defined_secret to slack, checkr-partner and checkr-partner-staging so their signing secrets can be configured. express.urlencoded now captures rawBody on the public API, where it was undefined for form encoded requests. Also declares the webhook NangoError types that were falling through to 500 with the payload echoed into the response. Providers that cannot be enforced yet are tracked separately. Follow up on connection level secrets is NAN-6927. | 2 天前 | |
fix(webhooks): enforce signature validation in webhook routing scripts (#7430) NAN-6909 Audits every webhook routing script and enforces signature validation wherever it can be enforced without breaking an existing user contract. PagerDuty verified the signature after dispatching to the customer scripts, so a forged webhook ran them before being rejected. Slack had no verification at all. Checkr logged that verification failed and processed the webhook anyway. All three reject now. GitHub App is handled separately. Signature comparisons are length safe across the board, so a malformed signature returns 401 instead of throwing a 500. HubSpot, Shopify, ConnectWise and Gmail had guards that could not fire or crashed on missing input. The HMAC and Svix verification that was copied across providers moves into a shared signature.ts. Folk now uses the connection metadata secret that PagerDuty and GitLab already use, with the integration level secret still working for single connection integrations. Where a provider supports verification but no secret is configured we still let the webhook through, and now write a warning to the customer operation logs saying their traffic is unverified. Adds webhook_user_defined_secret to slack, checkr-partner and checkr-partner-staging so their signing secrets can be configured. express.urlencoded now captures rawBody on the public API, where it was undefined for form encoded requests. Also declares the webhook NangoError types that were falling through to 500 with the payload echoed into the response. Providers that cannot be enforced yet are tracked separately. Follow up on connection level secrets is NAN-6927. | 2 天前 | |
feat: connection-level webhook url override (#6639) ### What Lets a single connection override the environment-wide webhook URLs with its own URL. Useful for routing one connection's sync/auth webhooks somewhere specific (e.g. a dev tunnel) without changing the shared environment endpoint. Works for all auth types, settable via the REST API, the connect SDK, or the dashboard's "Create connection" overrides. ### How Added `webhook_url ` to `ConnectionConfig`. This config is set at session creation time. We validate it just like the environment-level webhook urls (valid url that is not in our deny list). OAuth already merges connect-session `connection_config` defaults server-side; non-OAuth flows historically ignored them and only read request `params`. Had to tweak non-OAuth to do the same as OAuth: apply `connection_config` from the session on top of the ones from `params`. The session values intentionally override the `params`, since the session is the one created by the trusted actor. We only allow setting `webhook_url` at session creation, we ignore it from the `params` (because it's untrusted at that point). ### Usage Via sdk: ```ts const session = await nango.createConnectSession({ end_user: { id: 'user-123' }, allowed_integrations: ['my-integration'], integrations_config_defaults: { 'my-integration': { connection_config: { webhook_url: 'https://my-app.dev/nango-webhooks', webhook_url_secondary: 'https://my-app.dev/nango-webhooks-2' // optional } } } }); ``` In dashboard: <img width="1672" height="1478" alt="Kapture 2026-06-23 at 23 17 46" src="https://github.com/user-attachments/assets/e8193201-a538-420e-86f0-d67ecb645816" /> <!-- This is an auto-generated description by cubic. --> <a href="https://cubic.dev/pr/NangoHQ/nango/pull/6639?utm_source=github" target="_blank" rel="noopener noreferrer" data-no-image-dialog="true"><picture><source media="(prefers-color-scheme: dark)" srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img alt="Review in cubic" src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a> <!-- End of auto-generated description by cubic. --> | 2 个月前 | |
feat: move webhook_url override to top-level field. (#6778) > This is a breaking change with low surface impact After a lot of discussion we believe that `connection_config` was not the right place for `webhook_url`. We are trying to move quick while it's still not massively adopted (currently 2 accounts, using it incorrectly as the main `webhook_url` setting). This moves the setting to a top-level property on the connection called `webhook_url_override`. I also considered moving it to `overrides` on the connect_session, but the `overrides` object is keyed by integration, which doesn't really make sense for `webhook_url`. So I'm proposing this top-level alternative instead. Please look at the docs updates to understand the user-level change. --------- Co-authored-by: Cursor <cursoragent@cursor.com> | 1 个月前 | |
feat(server): Connection deleted webhook (#7235) <!-- Describe the problem and your solution --> Adds connection webhook deletion so customers can take appropriate cleanup actions on a connection deletion event <!-- Issue ticket number and link (if applicable) --> [NAN-5591: feat(server): Connection deleted webhook](https://linear.app/nango/issue/NAN-5591/featserver-connection-deleted-webhook) <!-- Testing instructions (skip if just adding/editing providers) --> 1. Configure your webhooks locally to point somewhere like [webhook.site](https://webhook.site/) or a local server for testing 2. Create a new connection if required 3. Delete connection 4. Receive webhook: { "operation": "deletion", "success": true, "type": "auth", ... } 5. Check log for associated entry <!-- This is an auto-generated description by cubic. --> <a href="https://cubic.dev/pr/NangoHQ/nango/pull/7235?utm_source=github" target="_blank" rel="noopener noreferrer" data-no-image-dialog="true"><picture><source media="(prefers-color-scheme: dark)" srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img alt="Review in cubic" src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a> <!-- End of auto-generated description by cubic. --> --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> | 10 天前 | |
fix(server): Clamp proxy retry to maximum duration (#7264) <!-- Describe the problem and your solution --> While investigating a spike in server latency at the top of each hour, we discovered long running proxy operations for customer Centralize that was causing requests to stack up at the top of each hour. The root cause seems to be our proxy handler respecting long retries (1 hour+) retrying operations long after the client request will have timed out. There should be a maximum value for retry-after beyond which proxy operations fast fail and return retry information to the caller. <!-- Issue ticket number and link (if applicable) --> [NAN-6759: fix(server): Add maximum retry-after in proxy calls](https://linear.app/nango/issue/NAN-6759/fixserver-add-maximum-retry-after-in-proxy-calls) <!-- Testing instructions (skip if just adding/editing providers) --> To test this I had an agent stand up a mock server temporarily. A quick summary is: 1. Edit `providers.yaml` for a provider like `private-api-bearer` or `unauthenticated` to support retry headers. There might be a provider you could use for this already, but I didn't see it 🤷 : ``` retry: after: - 'retry-after' ``` 2. Standup a mock endpoint that always returns a long retry header based on what you are using from 1 3. Create a new integration and connection for provider from step 1 4. Allow Nango to send traffic to your mock endpoint by setting the following in your `.env`: ``` NANGO_OUTBOUND_URL_POLICY={"blockPrivateIps":false} ``` 5. Proxy a request through Nango connection. It should fail fast with this change rather than hanging for the duration of the retry header you provided from the mock endpoint. <!-- This is an auto-generated description by cubic. --> <a href="https://cubic.dev/pr/NangoHQ/nango/pull/7264?utm_source=github" target="_blank" rel="noopener noreferrer" data-no-image-dialog="true"><picture><source media="(prefers-color-scheme: dark)" srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img alt="Review in cubic" src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a> <!-- End of auto-generated description by cubic. --> --------- Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com> | 2 天前 | |
feat(server): Connection deleted webhook (#7235) <!-- Describe the problem and your solution --> Adds connection webhook deletion so customers can take appropriate cleanup actions on a connection deletion event <!-- Issue ticket number and link (if applicable) --> [NAN-5591: feat(server): Connection deleted webhook](https://linear.app/nango/issue/NAN-5591/featserver-connection-deleted-webhook) <!-- Testing instructions (skip if just adding/editing providers) --> 1. Configure your webhooks locally to point somewhere like [webhook.site](https://webhook.site/) or a local server for testing 2. Create a new connection if required 3. Delete connection 4. Receive webhook: { "operation": "deletion", "success": true, "type": "auth", ... } 5. Check log for associated entry <!-- This is an auto-generated description by cubic. --> <a href="https://cubic.dev/pr/NangoHQ/nango/pull/7235?utm_source=github" target="_blank" rel="noopener noreferrer" data-no-image-dialog="true"><picture><source media="(prefers-color-scheme: dark)" srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img alt="Review in cubic" src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a> <!-- End of auto-generated description by cubic. --> --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> | 10 天前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 2 个月前 | ||
| 1 个月前 | ||
| 10 天前 | ||
| 10 天前 | ||
| 10 天前 | ||
| 1 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 9 个月前 | ||
| 2 天前 | ||
| 2 天前 | ||
| 2 个月前 | ||
| 1 个月前 | ||
| 10 天前 | ||
| 2 天前 | ||
| 10 天前 |