Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 3 additions & 22 deletions .fallowrc.jsonc
Original file line number Diff line number Diff line change
Expand Up @@ -32,28 +32,7 @@

"duplicates": {
"mode": "semantic",
"near": true,
"ignoredClones": [
"dup:22704c46:2",
"dup:3fec4231:2",
"dup:91b44e3a:2",
"dup:c77b3abb6f87acd9-10:2",
"dup:c77b3abb6f87acd9-11:2",
"dup:c77b3abb6f87acd9-12:2",
"dup:c77b3abb6f87acd9-13:2",
"dup:c77b3abb6f87acd9-14:2",
"dup:c77b3abb6f87acd9-15:2",
"dup:c77b3abb6f87acd9-16:2",
"dup:c77b3abb6f87acd9-1:2",
"dup:c77b3abb6f87acd9-2:2",
"dup:c77b3abb6f87acd9-3:2",
"dup:c77b3abb6f87acd9-4:2",
"dup:c77b3abb6f87acd9-5:2",
"dup:c77b3abb6f87acd9-6:2",
"dup:c77b3abb6f87acd9-7:2",
"dup:c77b3abb6f87acd9-8:2",
"dup:c77b3abb6f87acd9-9:2"
]
"near": true
},

"ignoreDependencies": [
Expand All @@ -64,6 +43,8 @@
"@shadcn/lint",
"@tanstack/intent",
"effect",
// Fallow resolves workspace imports to source but misses the root package dependency.
"effect-api-query",
"publint",
// React belongs to the private apps; Fallow attributes shared example sources to the root.
"react",
Expand Down
149 changes: 76 additions & 73 deletions .intent/review-state.json

Large diffs are not rendered by default.

7 changes: 7 additions & 0 deletions _artifacts/skill_tree.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,13 @@ skills:
slug: effect-api-query
domain: contract-queries
path: skills/effect-api-query/SKILL.md
references:
- references/rpc.md
- references/http.md
- references/query-patterns.md
- references/cache-workflows.md
- references/hydration-and-ssr.md
- references/frameworks-and-hosts.md
description: 'Use when integrating effect-api-query with an Effect RPC or
HttpApi contract: derive TanStack Query keys and options, choose buffered
or streaming views, configure metadata, pagination, defaults or cache
Expand Down
6 changes: 3 additions & 3 deletions apps/docs/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@
"preview": "astro preview"
},
"dependencies": {
"@astrojs/starlight": "0.42.5",
"astro": "7.3.5",
"starlight-links-validator": "0.26.0",
"@astrojs/starlight": "0.42.6",
"astro": "7.3.8",
"starlight-links-validator": "0.27.0",
"starlight-llms-txt": "0.12.0",
"starlight-theme-black": "0.7.1"
},
Expand Down
11 changes: 2 additions & 9 deletions apps/docs/src/content/docs/guides/websocket-clients.md
Original file line number Diff line number Diff line change
Expand Up @@ -75,15 +75,8 @@ has not cancelled the query. Its Cause preserves the failure received by the rea
Wire serialization can change the original server's Cause representation. A failed stream
leaves already published data available alongside its error.

With Effect 4.0.0, cancelling a paused stream with a full transport buffer of size 1 can
stall other calls on the connection. This recipe uses the native default of 16. Before changing
that setting, test smaller buffers against the pinned transport version.

The default buffer is not a guarantee for larger chunks or unfinished queue offers.

Keep streaming success schemas compatible on both ends. With Effect 4.0.0, a chunk that fails
client Schema decoding can also fail unrelated calls sharing the connection. A larger buffer
does not isolate decoding failures.
Keep streaming success schemas compatible on both ends. A chunk that fails client Schema
decoding ends the affected request.

Query cancellation cooperatively stops future work. It does not undo completed writes.
If the domain needs an explicit cancellation operation, use an [explicit cancellable command](/effect-api-query/guides/cancellation/).
11 changes: 4 additions & 7 deletions apps/docs/src/content/docs/reference/compatibility-and-limits.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,12 @@ The repository uses these versions:

| Integration | Versions |
| --------------------------------------------------- | ---------------------------------- |
| Effect runtime, testing, and Node platform packages | 4.0.0 |
| Query Core and React Query | 5.104.0, with matching versions |
| Effect runtime, testing, and Node platform packages | 4.0.2 |
| Query Core and React Query | 5.104.1, with matching versions |
| Published TypeScript contract | 5.9.3 and 7.0.2 |
| React | 19.3.0 |
| TanStack Start | 1.168.60 |
| TanStack Router and Router SSR Query | 1.170.41 and 1.167.3, respectively |
| TanStack Start | 1.168.61 |
| TanStack Router and Router SSR Query | 1.170.42 and 1.167.3, respectively |

The stable Effect release contains unstable RPC and HTTP API modules.
The application's Effect packages must stay coordinated with the exact peer. See
Expand Down Expand Up @@ -71,9 +71,6 @@ OpenAPI consumption with `openapi-fetch` and `openapi-typescript`. Encoded DTOs,
serialization, and raw SSE access retain their own contracts. The external client does not replace
a ready Effect client.

With Effect 4.0.0, single-element arrays in GET and form-urlencoded payloads can fail server
decoding. Array query parameters and JSON array responses retain their usual representation.

## Input and cache limits

Cache identity must be strict JSON. For endpoints with query support, encoding services, redacted
Expand Down
5 changes: 2 additions & 3 deletions apps/docs/src/content/docs/reference/external-http-clients.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ description: Generated OpenAPI consumers, encoded request values, multipart uplo
An external HTTP client can call an Effect HttpApi server through its declared HTTP contract.
For example, `openapi-typescript` generates `paths` from the JSON document returned by native
`OpenApi.fromApi(api)`. The generated types describe calls made with `openapi-fetch`.
The examples target `openapi-fetch` 0.17.0, `openapi-typescript` 7.13.0, and Effect 4.0.0.
The examples target `openapi-fetch` 0.17.0, `openapi-typescript` 7.13.0, and Effect 4.0.2.

`createHttpApiQueryUtils` accepts a ready Effect HttpApiClient with a native Effect runner.
An external Promise client calls HTTP independently. Compatibility with the declared HTTP contract
Expand Down Expand Up @@ -67,8 +67,7 @@ Its `Response` retains status and raw headers. The native
alongside immutable plain snapshots of status and headers.

Array query parameters use repeated names, including a single-element array. JSON array
responses retain their ordinary representation. GET and form-urlencoded payloads have separate
[upstream limits](/effect-api-query/reference/compatibility-and-limits/#capability-matrix).
responses retain their ordinary representation.

## Serialize multipart uploads explicitly

Expand Down
20 changes: 20 additions & 0 deletions examples/server/tests/rpc-websocket-consumer.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,31 @@ import { expect, it } from '@effect/vitest'
import { Effect } from 'effect'

import {
exerciseSocketBufferCancellation,
exerciseSocketConcurrency,
exerciseSocketDecodeIsolation,
exerciseSocketInterruption,
exerciseSocketReplacement,
} from '../../../tests/fixtures/websocket-checks.ts'

it.live('unblocks other socket calls when a full one-element stream buffer is cancelled', () =>
Effect.gen(function* () {
expect(yield* Effect.promise(exerciseSocketBufferCancellation)).toStrictEqual({
unaffectedRead: 30,
streamCancelled: true,
})
}),
)

it.live('keeps stream Schema decoding failures local to their request on a shared socket', () =>
Effect.gen(function* () {
expect(yield* Effect.promise(exerciseSocketDecodeIsolation)).toStrictEqual({
rejectedStreams: 2,
unaffectedRead: 30,
})
}),
)

it.live(
'runs concurrent reads and both open stream views through a ready WebSocket client',
() =>
Expand Down
2 changes: 1 addition & 1 deletion examples/tanstack-start/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
"@testing-library/react": "catalog:",
"@types/react": "catalog:",
"@types/react-dom": "catalog:",
"@vitejs/plugin-react": "6.1.1",
"@vitejs/plugin-react": "6.1.2",
"jsdom": "catalog:",
"tailwindcss": "catalog:",
"vite": "catalog:",
Expand Down
20 changes: 10 additions & 10 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -51,29 +51,29 @@
"@effect-api-query/contracts": "workspace:*",
"@effect-api-query/server": "workspace:*",
"@effect/platform-node": "catalog:",
"@effect/tsgo": "0.47.2",
"@effect/vitest": "4.0.0",
"@playwright/test": "1.63.0",
"@effect/tsgo": "0.51.1",
"@effect/vitest": "4.0.2",
"@playwright/test": "1.64.0",
"@shadcn/lint": "0.2.0",
"@tanstack/intent": "0.5.3",
"@tanstack/intent": "0.5.5",
"@tanstack/query-core": "catalog:",
"@tanstack/react-query": "catalog:",
"@tanstack/react-router": "catalog:",
"@tanstack/react-router-ssr-query": "catalog:",
"@tanstack/react-start": "catalog:",
"@types/node": "24.19.0",
"@types/node": "24.19.2",
"@types/react": "catalog:",
"@types/react-dom": "catalog:",
"effect": "catalog:",
"fallow": "3.31.0",
"oxlint": "1.85.0",
"publint": "0.3.24",
"fallow": "3.33.1",
"oxlint": "1.87.0",
"publint": "0.3.25",
"react": "catalog:",
"react-dom": "catalog:",
"tsx": "catalog:",
"typescript": "catalog:",
"typescript-5.9": "npm:typescript@5.9.3",
"ultracite": "7.12.2",
"ultracite": "7.12.4",
"unplugin-unused": "0.6.0",
"vite": "catalog:",
"vite-plus": "catalog:",
Expand All @@ -83,5 +83,5 @@
"@tanstack/query-core": ">=5.103.1 <6",
"effect": "catalog:"
},
"packageManager": "pnpm@12.8.2"
"packageManager": "pnpm@12.11.2"
}
Loading
Loading