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
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
17 changes: 17 additions & 0 deletions .changeset/update-effect-rc-112.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
---
"@effect-app/vue-components": patch
"effect-app": patch
"@effect-app/infra": patch
"@effect-app/cli": patch
"@effect-app/vue": patch
---

Update effect packages to `4.0.0-rc.112` (from `beta.107`): `effect`, `@effect/platform-node`, `@effect/platform-browser`, `@effect/atom-vue`, `@effect/sql-sqlite-node`, `@effect/vitest`. Sync `repos/effect` subtree from `Effect-TS/effect` at `effect@4.0.0-rc.112`.

API adaptations for rc.112:

- cluster encoded driver `resetAddress` → batched `resetAddresses`
- Cosmos `unprocessedMessages` honors optional `limit` / `addresses` (only claimed rows are returned)
- Service Bus `Runners.make` supplies `codecFor` for schema-aware RPC serialization
- `pnpm subtree:effect` passes `--url https://github.com/Effect-TS/effect.git` (published CLI still defaults to effect-smol)
- JSON Schema check constraints are compacted onto the parent (`minLength`/`maxLength` instead of `allOf`)
2 changes: 1 addition & 1 deletion .specs/Update-to-latest-Effect.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,4 @@ If new errors occur, first describe the problem, propose solutions and wait for
## Notes

- subtree url: `https://github.com/Effect-TS/effect.git`, prefix `repos/effect`, tag `effect@<version>`.
- v4 betas live under the npm `beta` dist-tag (npm `latest` is still v3). Find target with `npm view effect dist-tags`.
- v4 currently lives under the npm `rc` dist-tag (`beta` is frozen at `4.0.0-beta.107`; npm `latest` is still v3). Find target with `npm view effect dist-tags` — prefer `rc` if present, else `beta`.
6 changes: 3 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -50,15 +50,15 @@
"@effect-app/infra": "workspace:*",
"@effect/language-service": "0.86.2",
"@effect/tsgo": "^0.31.0",
"@effect/platform-node": "4.0.0-beta.107",
"@effect/vitest": "4.0.0-beta.107",
"@effect/platform-node": "4.0.0-rc.112",
"@effect/vitest": "4.0.0-rc.112",
"@tsconfig/strictest": "^2.0.8",
"@types/node": "25.9.1",
"@typescript-eslint/eslint-plugin": "8.60.0",
"@typescript-eslint/parser": "8.60.0",
"@typescript/native-preview": "7.0.0-dev.20260626.1",
"dprint": "^0.54.0",
"effect": "4.0.0-beta.107",
"effect": "4.0.0-rc.112",
"effect-app": "workspace:*",
"eslint": "^10.4.1",
"json5": "^2.2.3",
Expand Down
4 changes: 2 additions & 2 deletions packages/cli/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@
"effect-app-cli": "./bin.js"
},
"dependencies": {
"@effect/platform-node": "4.0.0-beta.107",
"effect": "4.0.0-beta.107",
"@effect/platform-node": "4.0.0-rc.112",
"effect": "4.0.0-rc.112",
"js-yaml": "4.2.0"
},
"devDependencies": {
Expand Down
8 changes: 4 additions & 4 deletions packages/e2e/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,13 @@
"effect-app": "workspace:*"
},
"devDependencies": {
"@effect/atom-vue": "^4.0.0-beta.107",
"@effect/platform-node": "4.0.0-beta.107",
"@effect/vitest": "4.0.0-beta.107",
"@effect/atom-vue": "^4.0.0-rc.112",
"@effect/platform-node": "4.0.0-rc.112",
"@effect/vitest": "4.0.0-rc.112",
"@tanstack/vue-query": "5.96.2",
"@types/node": "25.9.1",
"@vitejs/plugin-vue": "^6.0.7",
"effect": "^4.0.0-beta.107",
"effect": "^4.0.0-rc.112",
"typescript": "~6.0.3",
"vitest": "^4.1.7",
"vue": "^3.5.35"
Expand Down
2 changes: 1 addition & 1 deletion packages/effect-app/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
"vitest": "^4.1.7"
},
"peerDependencies": {
"effect": "^4.0.0-beta.107"
"effect": "^4.0.0-rc.112"
},
"typesVersions": {
"*": {
Expand Down
6 changes: 2 additions & 4 deletions packages/effect-app/test/schema.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -491,10 +491,8 @@ describe("JSON Schema", () => {
title: "Email",
description: "an email according to RFC 5322",
format: "email",
allOf: [
{ minLength: 3 },
{ maxLength: 998 }
]
minLength: 3,
maxLength: 998
}
}
})
Expand Down
6 changes: 3 additions & 3 deletions packages/infra/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
"devDependencies": {
"@azure/cosmos": "^4.9.3",
"@azure/service-bus": "^7.9.5",
"@effect/sql-sqlite-node": "4.0.0-beta.107",
"@effect/sql-sqlite-node": "4.0.0-rc.112",
"@sentry/opentelemetry": "10.55.0",
"@types/better-sqlite3": "^7.6.13",
"@types/node": "25.9.1",
Expand All @@ -39,12 +39,12 @@
"peerDependencies": {
"@azure/cosmos": "^4.9.3",
"@azure/service-bus": "^7.9.5",
"@effect/vitest": "^4.0.0-beta.107",
"@effect/vitest": "^4.0.0-rc.112",
"@sendgrid/helpers": "^8.0.0",
"@sendgrid/mail": "^8.1.6",
"@sentry/node": "10.55.0",
"@sentry/opentelemetry": "10.55.0",
"effect": "^4.0.0-beta.107",
"effect": "^4.0.0-rc.112",
"jwt-decode": "^4.0.0",
"redis": "^3.1.2",
"redlock": "^4.2.0"
Expand Down
76 changes: 56 additions & 20 deletions packages/infra/src/ClusterCosmos.ts
Original file line number Diff line number Diff line change
Expand Up @@ -624,21 +624,34 @@ export const makeMessageStorage = Effect.fnUntraced(function*(options?: {
withTracerDisabled
),

unprocessedMessages: (shardIds, now) =>
queryMessages(
"SELECT * FROM c WHERE c.type = 'message' AND ARRAY_CONTAINS(@shardIds, c.shardId) AND c.processed = false AND (NOT IS_DEFINED(c.lastRead) OR IS_NULL(c.lastRead) OR c.lastRead < @lastReadBefore) AND (NOT IS_DEFINED(c.deliverAt) OR IS_NULL(c.deliverAt) OR c.deliverAt <= @now) ORDER BY c.rowid",
[
{ name: "@shardIds", value: Array.from(shardIds) },
{ name: "@lastReadBefore", value: now - tenMinutes },
{ name: "@now", value: now }
]
)
unprocessedMessages: (shardIds, now, options) => {
if (options?.addresses !== undefined && options.addresses.length === 0) {
return Effect.succeed([])
}
const parameters: Array<CosmosParameter> = [
{ name: "@shardIds", value: Array.from(shardIds) },
{ name: "@lastReadBefore", value: now - tenMinutes },
{ name: "@now", value: now }
]
let query =
"SELECT * FROM c WHERE c.type = 'message' AND ARRAY_CONTAINS(@shardIds, c.shardId) AND c.processed = false AND (NOT IS_DEFINED(c.lastRead) OR IS_NULL(c.lastRead) OR c.lastRead < @lastReadBefore) AND (NOT IS_DEFINED(c.deliverAt) OR IS_NULL(c.deliverAt) OR c.deliverAt <= @now)"
if (options?.addresses !== undefined) {
const match = addressClauses(options.addresses, "a")
query += ` AND (${match.sql})`
parameters.push(...match.parameters)
}
query += " ORDER BY c.rowid"
if (options?.limit !== undefined) {
query += ` OFFSET 0 LIMIT ${Math.floor(options.limit)}`
}
return queryMessages(query, parameters)
.pipe(
Effect.flatMap((docs) => collectUnprocessed(docs, now, claimMessageRead, queryReplies)),
annotate("unprocessedMessages"),
refailPersistence,
withTracerDisabled
),
)
},

unprocessedMessagesById: (messageIds, now) =>
queryMessages(
Expand All @@ -655,21 +668,20 @@ export const makeMessageStorage = Effect.fnUntraced(function*(options?: {
withTracerDisabled
),

resetAddress: (address) =>
queryMessages(
"SELECT * FROM c WHERE c.type = 'message' AND c.processed = false AND c.shardId = @shardId AND c.entityType = @entityType AND c.entityId = @entityId",
[
{ name: "@shardId", value: ShardId.toString(address.shardId) },
{ name: "@entityType", value: address.entityType },
{ name: "@entityId", value: address.entityId }
]
resetAddresses: (addresses) => {
if (addresses.length === 0) return Effect.void
const match = addressClauses(addresses, "r")
return queryMessages(
`SELECT * FROM c WHERE c.type = 'message' AND c.processed = false AND (${match.sql})`,
match.parameters
)
.pipe(
Effect.flatMap((docs) => patchDocs(docs, () => [{ op: "set", path: "/lastRead", value: null }])),
annotate("resetAddress"),
annotate("resetAddresses"),
refailPersistence,
withTracerDisabled
),
)
},

clearAddress: (address) =>
queryMessages(
Expand Down Expand Up @@ -713,6 +725,30 @@ export const makeMessageStorage = Effect.fnUntraced(function*(options?: {
})
})

const addressClauses = (
addresses: ReadonlyArray<{
readonly shardId: Parameters<typeof ShardId.toString>[0]
readonly entityType: string
readonly entityId: string
}>,
prefix: string
): { readonly sql: string; readonly parameters: Array<CosmosParameter> } => {
const parameters: Array<CosmosParameter> = []
const clauses: Array<string> = []
for (const [i, address] of addresses.entries()) {
const shard = `@${prefix}s${i}`
const entityType = `@${prefix}t${i}`
const entityId = `@${prefix}e${i}`
clauses.push(`(c.shardId = ${shard} AND c.entityType = ${entityType} AND c.entityId = ${entityId})`)
parameters.push(
{ name: shard, value: ShardId.toString(address.shardId) },
{ name: entityType, value: address.entityType },
{ name: entityId, value: address.entityId }
)
}
return { sql: clauses.join(" OR "), parameters }
}

const collectUnprocessed = <E>(
docs: ReadonlyArray<MessageDoc>,
now: number,
Expand Down
2 changes: 2 additions & 0 deletions packages/infra/src/ClusterServiceBus.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import * as Context from "effect-app/Context"
import * as Effect from "effect-app/Effect"
import * as Layer from "effect-app/Layer"
import * as Data from "effect/Data"
import * as Schema from "effect/Schema"
import * as Scope from "effect/Scope"
import * as ClusterError from "effect/unstable/cluster/ClusterError"
import { Persisted } from "effect/unstable/cluster/ClusterSchema"
Expand Down Expand Up @@ -121,6 +122,7 @@ export const makeRunners: (
)

return yield* Runners.make({
codecFor: Schema.toCodecJson,
ping: (address) => Effect.fail(new ClusterError.RunnerUnavailable({ address })),
send: ({ address, message }) => {
const persisted = Context.get(message.rpc.annotations, Persisted)
Expand Down
2 changes: 1 addition & 1 deletion packages/vue-components/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
},
"peerDependencies": {
"@mdi/js": "^7.4.47",
"effect": "^4.0.0-beta.107",
"effect": "^4.0.0-rc.112",
"intl-messageformat": "^11.2.7",
"mdi-js": "^1.0.1",
"primeflex": "^4.0.0",
Expand Down
8 changes: 4 additions & 4 deletions packages/vue/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,14 @@
"query-string": "^9.4.0"
},
"peerDependencies": {
"@effect/atom-vue": "^4.0.0-beta.107",
"@effect/platform-browser": "^4.0.0-beta.107",
"@effect/atom-vue": "^4.0.0-rc.112",
"@effect/platform-browser": "^4.0.0-rc.112",
"@sentry/browser": "^10.55.0",
"effect": "^4.0.0-beta.107",
"effect": "^4.0.0-rc.112",
"vue": "^3.5.35"
},
"devDependencies": {
"@effect/vitest": "4.0.0-beta.107",
"@effect/vitest": "4.0.0-rc.112",
"@formatjs/icu-messageformat-parser": "^3.5.10",
"@types/node": "25.9.1",
"@vitejs/plugin-vue": "^6.0.7",
Expand Down
Loading
Loading