documentation/dsls/DSL-AshTypescript.TypedChannel.md

<!--
This file was generated by Spark. Do not edit it by hand.
-->
# AshTypescript.TypedChannel

Spark DSL extension for defining typed Phoenix channel event subscriptions.

Declares which Ash PubSub publications a channel intercepts. For each declared
event, AshTypescript reads the publication's `returns` type and generates a
typed TypeScript payload type. An event map and typed subscription helper are
also generated for the channel.

The recommended way to get typed payloads is to use `transform :some_calc` on
publications, pointing to a resource calculation with `:auto` typing. Ash
auto-derives the `returns` type from the calculation expression. You can also
use explicit `returns:` with an anonymous function transform.

## Usage

    defmodule MyAppWeb.OrgAdminChannel do
      use AshTypescript.TypedChannel

      @impl true
      def join("org_admin:" <> org_id, _payload, socket) do
        {:ok, socket}
      end

      typed_channel do
        resource MyApp.Post do
          publish :post_created
          publish :post_updated
        end

        resource MyApp.Comment do
          publish :comment_created
        end
      end
    end


## typed_channel
Configure typed channel subscriptions from Ash PubSub publications.

### Nested DSLs
 * [resource](#typed_channel-resource)
   * publish





### Options

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`topic`](#typed_channel-topic){: #typed_channel-topic .spark-required} | `String.t` |  | The Phoenix channel topic pattern (e.g. "org:*"). |



### typed_channel.resource
```elixir
resource module
```


Declare an Ash resource whose publications this channel subscribes to.

Each `publish` child declares a specific event to intercept.


### Nested DSLs
 * [publish](#typed_channel-resource-publish)




### Arguments

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`module`](#typed_channel-resource-module){: #typed_channel-resource-module .spark-required} | `atom` |  | The Ash resource module containing the PubSub publications. |



### typed_channel.resource.publish
```elixir
publish event
```


Declare a PubSub event to intercept on this channel.

The event name must match the `event` option (or action name fallback) of
a publication on the resource. The publication must have a `returns` type
for TypeScript type generation — either auto-derived via `transform :calc`
or explicitly set via `returns:`.






### Arguments

| Name | Type | Default | Docs |
|------|------|---------|------|
| [`event`](#typed_channel-resource-publish-event){: #typed_channel-resource-publish-event .spark-required} | `atom \| String.t` |  | The event name to intercept (atom or string). |






### Introspection

Target: `AshTypescript.TypedChannel.Dsl.Publication`




### Introspection

Target: `AshTypescript.TypedChannel.Dsl.ChannelResource`





<style type="text/css">.spark-required::after { content: "*"; color: red !important; }</style>