Skip to content

fix: separate in-page channel events from functions - #371

Merged
antfu merged 14 commits into
mainfrom
fix/in-page-channel-event-declarations
Sep 9, 2026
Merged

fix: separate in-page channel events from functions#371
antfu merged 14 commits into
mainfrom
fix/in-page-channel-event-declarations

Conversation

@posva

@posva posva commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

Separate in-page channel events from functions so actions that return void can still be awaited. Update a11y, docs, and tests for the new protocol shape.

Follow-up to #358. This changes the API and wire protocol.

Copilot AI lite review requested due to automatic review settings September 8, 2026 10:54
@coldtea-pr-lens

coldtea-pr-lens Bot commented Sep 8, 2026

Copy link
Copy Markdown

◈ PR Lens

🟢 +0 new · 🟠 ~9 changed · 🔴 -0 removed · 2 flows · 9 files · commit a20931f


Architecture

Architecture diagram for devframes/devframe at a20931f

9 components touched across 5 lanes.

Open the interactive canvas


Inside the changed components — 2 views

Component view — In-Page Channel Internals

Internal components of the in-page channel bridge separating function calls from events

Architecture view of Component view — In-Page Channel Internals in devframes/devframe

Component view — A11y Devframe Channel Integration

A11y inspector panel and page script communicating via event declarations

Architecture view of Component view — A11y Devframe Channel Integration in devframes/devframe

Data flow

Data flow diagram for devframes/devframe at a20931f

Executing an awaitable channel function · Emitting a fire-and-forget channel event

Open the interactive canvas


The other flows — 1 sequence

Emitting a fire-and-forget channel event

Sequence diagram of Emitting a fire-and-forget channel event in devframes/devframe

Drill down
Client Runtimes & UI — 5 components
🟡 CHANGED In-Page Channel Bridge

Connects page scripts and dock panels in the browser, separating request/response functions from fire-and-forget events.

🟡 CHANGED Page Script Channel

Hosts the page-script endpoint, fanning out events to connected panels and calling peer functions.

🟡 CHANGED Panel Channel

Connects dock panels to the page script, dispatching awaitable function calls and event broadcasts.

🟡 CHANGED Function & Event Registry

Maintains local function and event tables, namespacing wire methods and validating function targets with DF0077.

🟡 CHANGED Channel Wire Protocol

Defines the version 2 wire envelope and TypeScript contracts separating functions from events.

Built-in Devframes — 4 components
🟡 CHANGED A11y Inspector Devframe

Inspects web accessibility violations, emitting inspection events to the in-page client script.

🟡 CHANGED A11y Page Script

Runs in the target page, handling highlight, clear, rescan, and pin configuration events.

🟡 CHANGED A11y Panel App

Renders accessibility violations in dock panels and emits inspection events over the channel.

🟡 CHANGED A11y Channel Protocol

Declares a11y inspector event signatures under events.pageScript and types the shared state.


View

  • Architecture lens
  • Data flow lens
  • Expand every detail
  • Show unchanged neighbours

Tip

PR Lens is free for open source. A star on the repository is what keeps it going.

🪧 More tips
  • Run PR Lens on your own machine: npx skills add coldteadotai/pr-lens installs the agent skill. Then tell your coding agent: "Diagram the change you just made with PR Lens and attach it to the pull request."
  • Draw a diff before it is even a pull request: npx @coldtea/pr-lens-cli analyze --base origin/main reads the diff with your own model key, and npx @coldtea/pr-lens-cli render .pr-lens/graph.json draws the same lenses on your machine.
  • The boxes under View are live. Tick Architecture lens or Data flow lens to choose which diagrams appear, or Expand every detail to open every drill-down at once. The comment redraws in place a few seconds later.
  • Show unchanged neighbours lists the components this change did not touch alongside the ones it did, so the drill-down shows what the changed code sits next to.
  • GitHub will not let you zoom an image in a comment. The link under each diagram opens it on an interactive canvas, where you can zoom, pan and step through the flow.
  • The CLI's render picks up .github/pr-lens.yml automatically and applies your corrections (renames, exclusions, lane pins) at draw time.
  • Would you rather run it from CI on a key of your own? Add .github/workflows/pr-lens.yml with coldteadotai/pr-lens/packages/action@v0 and a model key in your repository secrets, say GEMINI_API_KEY. The Action asks Gemini by default, or OpenAI and any endpoint speaking /chat/completions through its provider input.
  • Push a new commit and the whole comment re-renders for the new head. An older run never overwrites a newer one, so a slow render cannot put a stale diagram back.
  • The diagrams follow your GitHub theme, so dark mode gets the dark render and light mode the light one, and the moving dots show this pull request's data in motion.

◈ Rendered by PR Lens · crafted with ❤️ by the Coldtea team · Come say hi on Discord

@vercel

vercel Bot commented Sep 8, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated
devframe Ignored Ignored Preview Sep 9, 2026 2:30pm UTC

@posva
posva marked this pull request as draft September 8, 2026 10:55

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Needs a closer look

It introduces a breaking wire/protocol change in a core communication layer (version bump + method namespacing), which warrants final human review despite strong test coverage.

Pull request overview

This PR updates devframe/in-page-channel to stop inferring events from void/Promise<void> return types by splitting the protocol into explicit functions and events, and bumps the in-page channel wire version to 2 to reflect the breaking change.

Changes:

  • Split InPageChannelProtocol into functions and events, and require both endpoint options (functions, events) to be provided explicitly.
  • Add separate wire namespaces for functions vs events (allowing same-named function/event) and migrate the a11y devframe + docs + diagnostics accordingly.
  • Update tests and public API snapshots to cover void actions, explicit event declarations, and same-name collisions.
File summaries
File Description
tests/snapshots/tsnapi/devframe/in-page-channel.snapshot.d.ts Updates public type snapshot to reflect the new functions/events protocol and endpoint options.
skills/devframe/SKILL.md Updates internal skill docs to describe the new explicit events model.
plugins/a11y/src/shared/protocol.ts Migrates the a11y in-page contract from function-inferred events to explicit events.pageScript.
plugins/a11y/src/client-script/index.ts Updates the page script endpoint to pass functions and events separately (and removes type: 'event' in function declarations).
plugins/a11y/app/lib/channel.ts Updates the panel endpoint to pass the required (empty) events map.
packages/devframe/src/in-page-channel/types.ts Introduces explicit protocol sections and updates endpoint option typing and channel method signatures accordingly.
packages/devframe/src/in-page-channel/types.test-d.ts Updates d.ts type tests for the new protocol shape and option requirements.
packages/devframe/src/in-page-channel/events.test-d.ts Adds focused d.ts tests ensuring void actions remain callable while events are explicitly emitted/subscribed.
packages/devframe/src/in-page-channel/protocol.ts Bumps IN_PAGE_CHANNEL_VERSION to 2 for the breaking wire change.
packages/devframe/src/in-page-channel/panel.ts Registers incoming events separately and routes call()/emit() through the new method namespacing.
packages/devframe/src/in-page-channel/page-script.ts Registers incoming events separately and routes peer calls / fan-out emits through the new method namespacing.
packages/devframe/src/in-page-channel/internal.ts Adds wire namespacing via channelMethod() and updates the local registry to separate function vs event resolution and returns handling.
packages/devframe/src/in-page-channel/in-page-channel.test.ts Expands runtime tests for explicit events, void actions, timeouts/errors, and same-name collisions.
packages/devframe/src/in-page-channel/diagnostics.ts Updates DF0077 to refer to undeclared events rather than functions.
docs/content/8.references/5.browser-api.md Documents the explicit functions vs events separation in the browser API reference.
docs/content/6.errors/index.md Updates the DF0077 title in the errors index.
docs/content/6.errors/DF0077.md Updates DF0077 docs and examples to match the new events option model.
docs/content/1.guide/12.in-page-channel.md Migrates the in-page channel guide to the new protocol shape and API semantics.
Review details
  • Files reviewed: 17/18 changed files
  • Comments generated: 1
  • Review effort level: Lite

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread packages/devframe/src/in-page-channel/internal.ts Outdated
name: MY_CHANNEL,
serialize: value => toRawDeep(value), // applied to every outgoing argument and result
functions: {},
events: { flash: {} },

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wonder if this should just be optional

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

right now used to diagnose missing events when emitted, so I feel like it can be useful to diagnose wrong names https://github.com/devframes/devframe/pull/371/changes#diff-c8bbf4963ef4b0c4ae6cc7164bfa1da31233ea66fdb9cda6b4b1c98568f62aa5R7

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I ended up making it optional, i feel like it makes more sense for events and they are already type safe (although we do accept any string with & string)

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

export function channelMethod(kind: 'function' | 'event', name: string): string {
// Keep user functions, user events, and internal methods in separate wire namespaces.
return `devframe:in-page:${kind}:${name}`

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

worth noting this changes how they are saved in the registry, it's more verbose but should be fine. It allows having an action and an event with the same name even thought I don't think people should do that

@posva
posva marked this pull request as ready for review September 9, 2026 12:10
Copilot AI review requested due to automatic review settings September 9, 2026 12:10

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Needs a closer look

It introduces a breaking API and wire-protocol change that should be validated by a human across downstream consumers and upgrade paths.

Review details
  • Files reviewed: 17/18 changed files
  • Comments generated: 1
  • Review effort level: Lite

Comment on lines +289 to +291
call: (fnName, ...args) => enqueueCall(channelMethod('function', fnName), serializeArgs(codec, args)) as Promise<any>,
emit: (fnName, ...args) => sendEvent(channelMethod('event', fnName), serializeArgs(codec, args)),
callEvent: (fnName, ...args) => sendEvent(channelMethod('event', fnName), serializeArgs(codec, args)),

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

The endpoint option typing for events in packages/devframe/src/in-page-channel/types.ts is inconsistent with the documented/intentional “complete events map” contract and should be aligned to avoid confusing or unsafe consumer behavior.

Once you've addressed the issues Copilot identified, you can request another Copilot review.

Review details
  • Files reviewed: 17/18 changed files
  • Comments generated: 2
  • Review effort level: Lite

Comment thread packages/devframe/src/in-page-channel/types.ts Outdated
Comment thread packages/devframe/src/in-page-channel/types.ts Outdated

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

The TypeScript surface currently has an API contract inconsistency (events optional in types.ts vs required in snapshots/docs) plus a broken DF0077 doc example that references an undefined channel.

Once you've addressed the issues Copilot identified, you can request another Copilot review.

Review details

Suppressed comments (3)

packages/devframe/src/in-page-channel/types.ts:258

  • events is currently optional here (and its entries are optional), but the public API snapshot and docs treat { name, functions, events } as required for both endpoints to preserve a completeness check. Making it optional lets callers omit event declarations entirely, which contradicts the documented protocol shape and the generated tsnapi snapshot for devframe/in-page-channel.
export interface CreatePageScriptChannelOptions<Protocol extends InPageChannelProtocol = InPageChannelProtocol> extends InPageChannelCommonOptions {
  /** Every page-script function declaration, with a required handler. */
  functions: CreatePageScriptChannelOptionsFunctions<Protocol>
  /** Optional metadata or handlers for incoming events. Listeners may instead subscribe through `channel.on()`. */
  events?: { [NAME in keyof PageScriptProtocolEvents<Protocol> & string]?: InPageEventOption<PageScriptProtocolEvents<Protocol>[NAME]> }
  /**

packages/devframe/src/in-page-channel/types.ts:272

  • Same as CreatePageScriptChannelOptions: events should be required (with required keys) to match the documented v2 protocol shape and the generated API snapshot. Leaving it optional makes it easy to accidentally omit event declarations and lose args/jsonSerializable validation for inbound events.
/** Options for {@link connectPanelChannel}. */
export interface ConnectPanelChannelOptions<Protocol extends InPageChannelProtocol = InPageChannelProtocol> extends InPageChannelCommonOptions {
  /** Every panel function declaration, with a required handler. */
  functions: ConnectPanelChannelOptionsFunctions<Protocol>
  /** Optional metadata or handlers for incoming events. Listeners may instead subscribe through `channel.on()`. */
  events?: { [NAME in keyof PanelProtocolEvents<Protocol> & string]?: InPageEventOption<PanelProtocolEvents<Protocol>[NAME]> }
  /**

packages/devframe/src/in-page-channel/panel.ts:291

  • PanelChannel.call() now passes a wire-prefixed method name (devframe:in-page:function:<name>) into enqueueCall(). Since enqueueCall() uses its method parameter directly in user-facing error/timeout messages, these messages will now include the internal wire prefix (e.g. call "devframe:in-page:function:save" timed out ...) instead of the logical function name (save). Consider stripping the channelMethod('function', '') prefix when formatting errors/timeouts (or threading a separate display name) so diagnostics remain readable.
    call: (fnName, ...args) => enqueueCall(channelMethod('function', fnName), serializeArgs(codec, args)) as Promise<any>,
    emit: (fnName, ...args) => sendEvent(channelMethod('event', fnName), serializeArgs(codec, args)),
    callEvent: (fnName, ...args) => sendEvent(channelMethod('event', fnName), serializeArgs(codec, args)),
  • Files reviewed: 16/17 changed files
  • Comments generated: 1
  • Review effort level: Lite

Comment thread docs/content/6.errors/DF0077.md Outdated
@posva
posva marked this pull request as draft September 9, 2026 12:49
@posva
posva marked this pull request as ready for review September 9, 2026 13:16
Copilot AI review requested due to automatic review settings September 9, 2026 13:16

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

There are confirmed user-facing documentation inaccuracies about events being required (it’s typed optional) and a user-facing error-message regression where prefixed wire method names can leak into panel call timeout/closed errors.

Once you've addressed the issues Copilot identified, you can request another Copilot review.

Review details

Suppressed comments (1)

packages/devframe/src/in-page-channel/panel.ts:291

  • PanelChannel.call() now passes a wire-prefixed method name (devframe:in-page:function:<name>) into enqueueCall(), but enqueueCall() uses that method string in its user-facing error messages (closed/timeout). This will surface internal wire prefixes in errors like call "devframe:in-page:function:save" ..., which is much harder to read and inconsistent with the page-script peer call path (which reports the bare function name). Consider keeping a separate display name for errors/logging (bare fnName) while still calling over the wire with the namespaced method.
    call: (fnName, ...args) => enqueueCall(channelMethod('function', fnName), serializeArgs(codec, args)) as Promise<any>,
    emit: (fnName, ...args) => sendEvent(channelMethod('event', fnName), serializeArgs(codec, args)),
    callEvent: (fnName, ...args) => sendEvent(channelMethod('event', fnName), serializeArgs(codec, args)),
  • Files reviewed: 16/17 changed files
  • Comments generated: 3
  • Review effort level: Lite

Comment thread docs/content/1.guide/12.in-page-channel.md Outdated
Comment thread docs/content/8.references/5.browser-api.md Outdated
Comment thread skills/devframe/SKILL.md Outdated
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings September 9, 2026 13:53
posva and others added 2 commits September 9, 2026 15:54
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Needs a closer look

There are user-facing documentation/API wording inconsistencies (re: whether events is required) and a likely user-visible error-message regression on panel.call() due to passing wire-prefixed method names into existing error formatting.

Review details

Suppressed comments (3)

docs/content/8.references/5.browser-api.md:53

  • The docs say endpoint options require a complete events map, but in the actual API events is optional (CreatePageScriptChannelOptions.events? / ConnectPanelChannelOptions.events?). This is inconsistent with the guide and the exported types, and may mislead users into thinking they must always provide events: {}.
`InPageChannelProtocol` separates `functions` and `events`. Each section has optional `pageScript` and `panel` maps naming the receiving direction. Endpoint options require a complete `functions` map with handlers; `events` is optional, and when provided can include optional handlers (use `{}` to declare an event without a handler for `channel.on()`). `call()` uses function names regardless of return type, while `emit()`, `callEvent()` (deprecated), and `on()` use event names. A function returning `void` or `Promise<void>` remains an awaitable request/response call.

packages/devframe/src/in-page-channel/panel.ts:291

  • panel.call() now prefixes the method with devframe:in-page:function:. This value is also used in enqueueCall() error strings (closed/timeout), so user-facing errors will include the wire method name instead of the original function name (e.g. call "devframe:in-page:function:measure" timed out…). Consider keeping the wire method separate from the display name used in error messages.
    call: (fnName, ...args) => enqueueCall(channelMethod('function', fnName), serializeArgs(codec, args)) as Promise<any>,
    emit: (fnName, ...args) => sendEvent(channelMethod('event', fnName), serializeArgs(codec, args)),
    callEvent: (fnName, ...args) => sendEvent(channelMethod('event', fnName), serializeArgs(codec, args)),

skills/devframe/SKILL.md:441

  • This guide text claims createPageScriptChannel() / connectPanelChannel() require { name, functions, events }, but events is optional in the exported types. The wording should match the actual API shape to avoid confusion.
For a live inspect-the-page loop, `devframe/in-page-channel` connects a devframe's **page script** (in the user app's page) to its **panels** entirely in the browser, in both dev and static builds. Declare a shared protocol type with separate `functions` and `events` sections, each with `pageScript` and `panel` maps naming the receiving direction. Both `createPageScriptChannel<P>()` and `connectPanelChannel<P>()` require `{ name, functions }` and accept optional `events`: function declarations require handlers; event declarations accept optional handlers or `{}` for dynamic `channel.on()` subscriptions. `call()` awaits functions, including void actions; `emit()` sends declared events. `channel.sharedState.get(key)` mirrors `rpc.sharedState` with the page script as authority and automatic replay to panels. The handshake retries across boot order and reloads; panels expose `status`/`whenConnected(ms)` for page-script availability fallbacks. Channel names follow `devframes:plugin:<slug>`. The a11y inspector's scan/highlight loop is the reference use.
  • Files reviewed: 16/17 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

Copilot AI review requested due to automatic review settings September 9, 2026 13:58

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

There are at least two user-facing issues to address (a guide example that won’t type-check with the new protocol and a panel-side call error/timeout message regression that now includes wire-prefixed method names).

Once you've addressed the issues Copilot identified, you can request another Copilot review.

Review details

Suppressed comments (1)

packages/devframe/src/in-page-channel/panel.ts:291

  • call() now passes a namespaced wire method (devframe:in-page:function:<name>) into enqueueCall(). Because enqueueCall() formats user-facing errors/timeouts using that method string, messages will now include the wire prefix instead of the function name (e.g. call "devframe:in-page:function:save" ...). Consider carrying both a wire method and a display name so errors stay readable.
    call: (fnName, ...args) => enqueueCall(channelMethod('function', fnName), serializeArgs(codec, args)) as Promise<any>,
    emit: (fnName, ...args) => sendEvent(channelMethod('event', fnName), serializeArgs(codec, args)),
    callEvent: (fnName, ...args) => sendEvent(channelMethod('event', fnName), serializeArgs(codec, args)),
  • Files reviewed: 16/17 changed files
  • Comments generated: 1
  • Review effort level: Lite

Comment thread docs/content/1.guide/12.in-page-channel.md
Copilot AI review requested due to automatic review settings September 9, 2026 14:10

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Needs a closer look

A few user-facing docs and messages are now slightly inconsistent with the runtime behavior (notably event subscription without declarations and panel call error text), and should be corrected before approval.

Review details

Suppressed comments (4)

Previously missed (3) — in code that hasn't changed since the last review.

docs/content/1.guide/12.in-page-channel.md:69

  • This guide text states that {} “registers an event for runtime subscriptions through on()”, but runtime subscriptions also work without any events declarations. Please adjust wording to indicate events is optional and primarily enables validation/metadata for incoming events, while on() can still be used for undeclared events (without validation).
    docs/content/8.references/5.browser-api.md:54
  • Docs imply that {} in the events option is required to use channel.on(), but the implementation intentionally allows subscribing to undeclared events (see in-page-channel.test.ts: "accepts listeners without runtime event declarations"). Please clarify that events declarations are optional and mainly provide metadata (e.g. args validation / jsonSerializable enforcement) for incoming events.
    skills/devframe/SKILL.md:441
  • This skill text says event declarations use {} for dynamic channel.on() subscriptions, but the runtime also allows channel.on() without any events declarations (at the cost of losing validation/metadata). Please tweak wording so it matches the actual API behavior.

packages/devframe/src/in-page-channel/panel.ts:291

  • connectPanelChannel().call() now passes a wire-namespaced method (e.g. devframe:in-page:function:echo) into enqueueCall(), which uses that string in user-facing timeout/closed error messages. This makes errors harder to read and leaks wire details; callers should continue to see the original function name (e.g. echo). Consider updating enqueueCall() to accept both a display name and a wire method, or keep enqueueCall() taking the display name and apply channelMethod('function', ...) only at the RPC boundary.
    call: (fnName, ...args) => enqueueCall(channelMethod('function', fnName), serializeArgs(codec, args)) as Promise<any>,
    emit: (fnName, ...args) => sendEvent(channelMethod('event', fnName), serializeArgs(codec, args)),
    callEvent: (fnName, ...args) => sendEvent(channelMethod('event', fnName), serializeArgs(codec, args)),
  • Files reviewed: 16/17 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

Copilot AI review requested due to automatic review settings September 9, 2026 14:30

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Needs a closer look

It introduces a breaking wire-protocol change in a core communication path and should receive final human review for compatibility and UX details (e.g., error surfaces) before approval.

Review details

Suppressed comments (1)

packages/devframe/src/in-page-channel/panel.ts:291

  • call() now forwards a wire-namespaced method (via channelMethod('function', fnName)) into enqueueCall(), but enqueueCall() formats user-facing timeout/closed errors using that method string. This will leak internal wire names like devframe:in-page:function:save into errors instead of the original function name, and makes panel-side messages inconsistent with the page-script peer call path (which still reports the plain name).
    call: (fnName, ...args) => enqueueCall(channelMethod('function', fnName), serializeArgs(codec, args)) as Promise<any>,
    emit: (fnName, ...args) => sendEvent(channelMethod('event', fnName), serializeArgs(codec, args)),
    callEvent: (fnName, ...args) => sendEvent(channelMethod('event', fnName), serializeArgs(codec, args)),
  • Files reviewed: 16/17 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

@antfu
antfu merged commit bda5bc0 into main Sep 9, 2026
15 checks passed
@antfu
antfu deleted the fix/in-page-channel-event-declarations branch September 9, 2026 23:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants