Skip to content

feat: socket-protocol-parsing service - #8302

Open
harrysolovay wants to merge 3 commits into
Effect-TS:mainfrom
harrysolovay:harry/socket-protocol-service
Open

harrysolovay wants to merge 3 commits into
Effect-TS:mainfrom
harrysolovay:harry/socket-protocol-service

Conversation

@harrysolovay

Copy link
Copy Markdown

I kept running into the need to extract socket protocol tokens from the given HttpServerRequest. Figured I'd propose this util; I'm not sure if unstable/socket is the correct place for this (vs. in the http module).

Adds a SocketProtocols service to effect/unstable/socket for reading and parsing the Sec-WebSocket-Protocol request header.

Adds a `SocketProtocols` service that reads the `Sec-WebSocket-Protocol`
header from the current `HttpServerRequest` and exposes the parsed list of
sub-protocol names, plus a `Schema` for converting between the header
string and an array of trimmed protocol names.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@changeset-bot

changeset-bot Bot commented Sep 18, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 15b7b7a

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 31 packages
Name Type
effect Patch
@effect/opentelemetry Patch
@effect/vitest Patch
@effect/ai-anthropic Patch
@effect/ai-openai-compat Patch
@effect/ai-openai Patch
@effect/ai-openrouter Patch
@effect/ai-typesafe Patch
@effect/atom-react Patch
@effect/atom-solid Patch
@effect/atom-vue Patch
@effect/platform-browser Patch
@effect/platform-bun Patch
@effect/platform-deno Patch
@effect/platform-node-shared Patch
@effect/platform-node Patch
@effect/sql-clickhouse Patch
@effect/sql-d1 Patch
@effect/sql-libsql Patch
@effect/sql-mssql Patch
@effect/sql-mysql2 Patch
@effect/sql-pg Patch
@effect/sql-pglite Patch
@effect/sql-sqlite-bun Patch
@effect/sql-sqlite-do Patch
@effect/sql-sqlite-node Patch
@effect/sql-sqlite-react-native Patch
@effect/sql-sqlite-wasm Patch
@effect/docgen Patch
@effect/doctest Patch
@effect/openapi-generator Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

Comment thread packages/effect/src/unstable/socket/SocketProtocols.ts Outdated
@github-actions

Copy link
Copy Markdown
Contributor

Bundle Size Analysis

Generated from PR build output; treat the content below as untrusted.

File Name Current Size Previous Size Difference
arbitrary-combinators.ts 37.71 KB 37.71 KB 0.00 KB (0.00%)
basic.ts 6.87 KB 6.87 KB 0.00 KB (0.00%)
batching.ts 9.95 KB 9.95 KB 0.00 KB (0.00%)
brand.ts 6.45 KB 6.45 KB 0.00 KB (0.00%)
cache.ts 10.77 KB 10.77 KB 0.00 KB (0.00%)
config.ts 21.83 KB 21.83 KB 0.00 KB (0.00%)
differ.ts 20.67 KB 20.67 KB 0.00 KB (0.00%)
http-client.ts 21.94 KB 21.94 KB 0.00 KB (0.00%)
http-router.ts 36.96 KB 36.96 KB 0.00 KB (0.00%)
logger.ts 10.88 KB 10.88 KB 0.00 KB (0.00%)
metric.ts 9.02 KB 9.02 KB 0.00 KB (0.00%)
optic.ts 6.70 KB 6.70 KB 0.00 KB (0.00%)
pubsub.ts 15.10 KB 15.10 KB 0.00 KB (0.00%)
queue.ts 11.85 KB 11.85 KB 0.00 KB (0.00%)
schedule.ts 10.96 KB 10.96 KB 0.00 KB (0.00%)
schema-bigdecimal.ts 13.40 KB 13.40 KB 0.00 KB (0.00%)
schema-binary.ts 39.82 KB 39.82 KB 0.00 KB (0.00%)
schema-class.ts 20.38 KB 20.38 KB 0.00 KB (0.00%)
schema-fromJsonSchemaDocument.ts 31.18 KB 31.18 KB 0.00 KB (0.00%)
schema-representation-roundtrip.ts 26.60 KB 26.60 KB 0.00 KB (0.00%)
schema-string-transformation.ts 13.96 KB 13.96 KB 0.00 KB (0.00%)
schema-string.ts 11.55 KB 11.55 KB 0.00 KB (0.00%)
schema-template-literal.ts 15.70 KB 15.70 KB 0.00 KB (0.00%)
schema-toArbitrary.ts 37.24 KB 37.24 KB 0.00 KB (0.00%)
schema-toCodeDocument.ts 24.84 KB 24.84 KB 0.00 KB (0.00%)
schema-toCodecJson.ts 19.61 KB 19.61 KB 0.00 KB (0.00%)
schema-toEquivalence.ts 19.75 KB 19.75 KB 0.00 KB (0.00%)
schema-toFormatter.ts 19.85 KB 19.85 KB 0.00 KB (0.00%)
schema-toJsonSchemaDocument.ts 24.15 KB 24.15 KB 0.00 KB (0.00%)
schema-toRepresentation.ts 19.89 KB 19.89 KB 0.00 KB (0.00%)
schema.ts 19.59 KB 19.59 KB 0.00 KB (0.00%)
stm.ts 12.80 KB 12.80 KB 0.00 KB (0.00%)
stream.ts 9.83 KB 9.83 KB 0.00 KB (0.00%)

@ArjunCodess

Copy link
Copy Markdown

looked through this. schema + the request layer are the same shape i was going to add.

missing header yields undefined, which is actually the nicer fail-open. empty header still becomes []. that answers the question i asked on #7374.

two gaps vs the original issue:

  1. the client SocketConstructor layer is still missing. the ticket wanted SocketProtocols.layer(["a", "b", "c"]) on the websocket constructor. this pr only covers the server read.
  2. "a,,b" will decode to a hole in the array. worth filtering empty tokens.

on your note: yeah, export layer at module level. SocketProtocols.layer reads better than SocketProtocols.SocketProtocols.layer.

and the socket package pulling HttpServerRequest is a bit sideways. if the client piece lands later, maybe keep the schema in socket and the request layer in http.

tests look good for the happy path. i'd add the empty-token case and a lowercase header, since browsers send sec-websocket-protocol.

i'll drop my claim on #7374. this is yours.

- Keep the Sec-WebSocket-Protocol schema in effect/unstable/socket and
  drop empty tokens when decoding, so "a,,b" decodes to ["a", "b"]
- Move the service into a new effect/unstable/http/HttpSocketProtocols
  module along with the header key constant, with the layer exported at
  module level and its logic inlined in Layer.effect
- Add tests for empty tokens and lowercase header names

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Also import the socket protocols schema by name instead of as a
namespace, since it is the only member used.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@harrysolovay

Copy link
Copy Markdown
Author

@ArjunCodess I just addressed your (excellent) feedback – ready for another review

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

4.0 enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants