Share one RpcPromise alias between Result and the public export - #237

Merged
dimitropoulos merged 4 commits into
cloudflare:mainfrom
Maximo-Guk:shared-rpc-promise-alias
Aug 12, 2026
Merged

Share one RpcPromise alias between Result and the public export#237
dimitropoulos merged 4 commits into
cloudflare:mainfrom
Maximo-Guk:shared-rpc-promise-alias

Conversation

@Maximo-Guk

@Maximo-GukMaximo-Guk commented Aug 12, 2026

Copy link
Copy Markdown
Member

Defines RpcPromise once in types.d.ts so Result's arms and the public export resolve to the same alias instantiation. Fixes all TypeScript 7 (tsgo) depth errors (TS2321/TS2589) with no test assertion changes, and drops 5.9 type instantiations 175,019 → 151,466 — which also makes the RpcSession<undefined> workaround in index.test.ts unnecessary.

Maximo-Gukand others added 2 commits August 12, 2026 07:38
Result's Stubable and RpcCompatible arms and the public RpcPromise built
structurally-identical intersections from different aliases, forcing the
checker through a member-by-member structural comparison of the mutually
recursive Stubify/Provider cycles. Defining RpcPromise once in types.d.ts
(conditional on Stubable, so each arm resolves to exactly the type it had
before) lets same-alias-same-args comparisons short-circuit on identity.
tsc 5.9: type-tests stay 0-error; instantiations drop 175,019 -> 151,466.
tsgo 7.0.2: all 11 depth errors in __type-tests__ and all 12 (+6 cascades)
in __tests__ at index.test.ts:808/:967/:1334 and workerd.test.ts:183
disappear; no test assertion changed.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…essary
The TODO at this site documented a TS2589 on TypeScript 5.9 when relying on
the default type argument. With Result and RpcPromise sharing one alias the
relation no longer recurses past the depth budget, so the explicit
<undefined> can go -- and staying removed is a regression canary for the
restructuring helping Strada, not just tsgo.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@changeset-bot

changeset-botBot commented Aug 12, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 778dd8e

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

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

@github-actions

github-actionsBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

All contributors have signed the CLA ✍️ ✅
Posted by the CLA Assistant Lite bot.

@pkg-pr-new

pkg-pr-newBot commented Aug 12, 2026

Copy link
Copy Markdown

Open in StackBlitz

npm i https://pkg.pr.new/cloudflare/capnweb@237

commit: 778dd8e

@Maximo-Guk
Maximo-Guk marked this pull request as ready for review August 12, 2026 15:18
@Maximo-Guk

Copy link
Copy Markdown
MemberAuthor

I have read the CLA Document and I hereby sign the CLA

github-actionsBot added a commit that referenced this pull request Aug 12, 2026
@teamchong

Copy link
Copy Markdown
Collaborator

/bonk review this

@ask-bonkask-bonkBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Review: Share one RpcPromise alias

Nice, well-motivated change. I checked out the branch and verified the claims:

  • npm run test:types (TS 5.9) passes cleanly.
  • tsc --extendedDiagnostics reports Instantiations: 151466, exactly matching the PR description (175,019 → 151,466).
  • Removing the RpcSession<undefined> workaround in index.test.ts is safe: RpcSession<T extends RpcCompatible<T> = undefined> (src/index.ts:72) already defaults to undefined, and the type tests confirm it now compiles without the explicit arg.

On the semantics of the public alias

The old public type was Stub<T> & Promise<Stubify<T>>, whereas the new alias mirrors Result's arms (Promise<...> & Provider<T> & StubBase<T>). These are not structurally identical (e.g. for a primitive T, the new form adds Provider<T>), so this is a real change to the exported type, not a pure refactor. That said, it's a defensible — arguably better — one: RpcPromise is documented as "the result of an RPC call" (src/index.ts:45), so having the public alias resolve to the same thing Result<T> produces is more accurate, and it's what actually flows out of pipelined calls. The identity short-circuit that fixes the tsgo depth errors is a nice bonus. Worth a sentence in the PR body calling out that the exported type shape shifts slightly, for anyone relying on it structurally.

One cleanup

The Stubify import in index.ts is now unused — it was only referenced by the old RpcPromise definition. Neither tsconfig enables noUnusedLocals, so it slips through, but it's dead code now.

Overall this looks correct and is a solid improvement. Just the unused-import nit below.

Comment threadsrc/index.ts Outdated
@ask-bonk

ask-bonkBot commented Aug 12, 2026

Copy link
Copy Markdown

Review posted successfully. Here's a summary of what I did and found:

Review Summary for PR #237

I checked out the branch, installed deps, and independently verified the PR's claims:

Verified ✅

  • npm run test:types (TS 5.9) passes cleanly — no assertion changes needed.
  • tsc --extendedDiagnostics reports Instantiations: 151466, matching the PR description exactly (175,019 → 151,466).
  • Removing the RpcSession<undefined> workaround in index.test.ts is safe: the class already defaults T = undefined (src/index.ts:72), and the type tests confirm it now compiles without the explicit argument.

Observations raised in the review

  1. Semantics — The public RpcPromise<T> alias changed from Stub<T> & Promise<Stubify<T>> to mirror Result's arms. These are not structurally identical (e.g. for a primitive T, the new form adds Provider<T>), so it's a genuine change to the exported type, not a pure refactor. I judged it defensible/better since RpcPromise is documented as "the result of an RPC call," but flagged that the PR body should mention the exported shape shifts slightly.

  2. Cleanup (inline suggestion)Stubify is now an unused import in index.ts (only the old definition referenced it). Neither tsconfig enables noUnusedLocals, so it slipped through. Posted a suggestion to drop it.

Overall assessment: correct and a solid improvement, with one minor unused-import nit.

github run

github-actionsBot pushed a commit to Maximo-Guk/capnweb that referenced this pull request Aug 12, 2026
Co-authored-by: teamchong <teamchong@users.noreply.github.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Maximo-Guk
Maximo-Gukforce-pushed the shared-rpc-promise-alias branch from ef5c64b to cce0eb9CompareAugust 12, 2026 15:30
@dimitropoulos
dimitropoulosforce-pushed the shared-rpc-promise-alias branch from cce0eb9 to 27b5d05CompareAugust 12, 2026 15:50
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Maximo-Guk
Maximo-Gukforce-pushed the shared-rpc-promise-alias branch from 27b5d05 to 778dd8eCompareAugust 12, 2026 16:04
@dimitropoulos
dimitropoulos merged commit 5da3786 into cloudflare:mainAug 12, 2026
5 checks passed
Maximo-Guk added a commit to cloudflare/cloudflare-os that referenced this pull request Aug 12, 2026
The typescript catalog entry moves to 7.0.2; capnweb 0.11's shared
RpcPromise alias (cloudflare/capnweb#237) removed the depth errors that
blocked this. Consumers of the JS compiler API keep a JS-based compiler:
capnweb-validate's transform gets a pinned typescript 6.0.3 dependency
via .pnpmfile.cjs (its typescript peer would otherwise resolve to 7.x,
which ships no compiler API), and the configurator build script plus the
mcp-shared schema test import the typescript6 alias. typed-storage gains
the rootDir TS7 emit requires, workshop-backend drops an Env.BROWSER
optional override TS7 rejects (use sites read BrowserRun | undefined),
and three map/filter callbacks get explicit parameter types.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Maximo-Guk added a commit to cloudflare/cloudflare-os that referenced this pull request Aug 12, 2026
The typescript catalog entry moves to 7.0.2; capnweb 0.11's shared
RpcPromise alias (cloudflare/capnweb#237) removed the depth errors that
blocked this. Consumers of the JS compiler API keep a JS-based compiler:
capnweb-validate's transform gets a pinned typescript 6.0.3 dependency
via .pnpmfile.cjs (its typescript peer would otherwise resolve to 7.x,
which ships no compiler API), and the configurator build script plus the
mcp-shared schema test import the typescript6 alias. typed-storage gains
the rootDir TS7 emit requires, workshop-backend drops an Env.BROWSER
optional override TS7 rejects (use sites read BrowserRun | undefined),
and three map/filter callbacks get explicit parameter types.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Maximo-Guk added a commit to cloudflare/cloudflare-os that referenced this pull request Aug 12, 2026
The typescript catalog entry moves to 7.0.2; capnweb 0.11's shared
RpcPromise alias (cloudflare/capnweb#237) removed the depth errors that
blocked this. Consumers of the JS compiler API keep a JS-based compiler:
capnweb-validate's transform gets a pinned typescript 6.0.3 dependency
via .pnpmfile.cjs (its typescript peer would otherwise resolve to 7.x,
which ships no compiler API), and the configurator build script plus the
mcp-shared schema test import the typescript6 alias. typed-storage gains
the rootDir TS7 emit requires, workshop-backend drops an Env.BROWSER
optional override TS7 rejects (use sites read BrowserRun | undefined),
and three map/filter callbacks get explicit parameter types.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto 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

@Maximo-Guk@teamchong@dimitropoulos
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Share one RpcPromise alias between Result and the public export - #237

Merged
dimitropoulos merged 4 commits into
cloudflare:mainfrom
Maximo-Guk:shared-rpc-promise-alias
Aug 12, 2026
Merged

Share one RpcPromise alias between Result and the public export#237
dimitropoulos merged 4 commits into
cloudflare:mainfrom
Maximo-Guk:shared-rpc-promise-alias

Conversation

@Maximo-Guk

@Maximo-GukMaximo-Guk commented Aug 12, 2026

Copy link
Copy Markdown
Member

Defines RpcPromise once in types.d.ts so Result's arms and the public export resolve to the same alias instantiation. Fixes all TypeScript 7 (tsgo) depth errors (TS2321/TS2589) with no test assertion changes, and drops 5.9 type instantiations 175,019 → 151,466 — which also makes the RpcSession<undefined> workaround in index.test.ts unnecessary.

Maximo-Gukand others added 2 commits August 12, 2026 07:38
Result's Stubable and RpcCompatible arms and the public RpcPromise built
structurally-identical intersections from different aliases, forcing the
checker through a member-by-member structural comparison of the mutually
recursive Stubify/Provider cycles. Defining RpcPromise once in types.d.ts
(conditional on Stubable, so each arm resolves to exactly the type it had
before) lets same-alias-same-args comparisons short-circuit on identity.
tsc 5.9: type-tests stay 0-error; instantiations drop 175,019 -> 151,466.
tsgo 7.0.2: all 11 depth errors in __type-tests__ and all 12 (+6 cascades)
in __tests__ at index.test.ts:808/:967/:1334 and workerd.test.ts:183
disappear; no test assertion changed.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…essary
The TODO at this site documented a TS2589 on TypeScript 5.9 when relying on
the default type argument. With Result and RpcPromise sharing one alias the
relation no longer recurses past the depth budget, so the explicit
<undefined> can go -- and staying removed is a regression canary for the
restructuring helping Strada, not just tsgo.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@changeset-bot

changeset-botBot commented Aug 12, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 778dd8e

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

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

@github-actions

github-actionsBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

All contributors have signed the CLA ✍️ ✅
Posted by the CLA Assistant Lite bot.

@pkg-pr-new

pkg-pr-newBot commented Aug 12, 2026

Copy link
Copy Markdown

Open in StackBlitz

npm i https://pkg.pr.new/cloudflare/capnweb@237

commit: 778dd8e

@Maximo-Guk
Maximo-Guk marked this pull request as ready for review August 12, 2026 15:18
@Maximo-Guk

Copy link
Copy Markdown
MemberAuthor

I have read the CLA Document and I hereby sign the CLA

github-actionsBot added a commit that referenced this pull request Aug 12, 2026
@teamchong

Copy link
Copy Markdown
Collaborator

/bonk review this

@ask-bonkask-bonkBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Review: Share one RpcPromise alias

Nice, well-motivated change. I checked out the branch and verified the claims:

  • npm run test:types (TS 5.9) passes cleanly.
  • tsc --extendedDiagnostics reports Instantiations: 151466, exactly matching the PR description (175,019 → 151,466).
  • Removing the RpcSession<undefined> workaround in index.test.ts is safe: RpcSession<T extends RpcCompatible<T> = undefined> (src/index.ts:72) already defaults to undefined, and the type tests confirm it now compiles without the explicit arg.

On the semantics of the public alias

The old public type was Stub<T> & Promise<Stubify<T>>, whereas the new alias mirrors Result's arms (Promise<...> & Provider<T> & StubBase<T>). These are not structurally identical (e.g. for a primitive T, the new form adds Provider<T>), so this is a real change to the exported type, not a pure refactor. That said, it's a defensible — arguably better — one: RpcPromise is documented as "the result of an RPC call" (src/index.ts:45), so having the public alias resolve to the same thing Result<T> produces is more accurate, and it's what actually flows out of pipelined calls. The identity short-circuit that fixes the tsgo depth errors is a nice bonus. Worth a sentence in the PR body calling out that the exported type shape shifts slightly, for anyone relying on it structurally.

One cleanup

The Stubify import in index.ts is now unused — it was only referenced by the old RpcPromise definition. Neither tsconfig enables noUnusedLocals, so it slips through, but it's dead code now.

Overall this looks correct and is a solid improvement. Just the unused-import nit below.

Comment threadsrc/index.ts Outdated
@ask-bonk

ask-bonkBot commented Aug 12, 2026

Copy link
Copy Markdown

Review posted successfully. Here's a summary of what I did and found:

Review Summary for PR #237

I checked out the branch, installed deps, and independently verified the PR's claims:

Verified ✅

  • npm run test:types (TS 5.9) passes cleanly — no assertion changes needed.
  • tsc --extendedDiagnostics reports Instantiations: 151466, matching the PR description exactly (175,019 → 151,466).
  • Removing the RpcSession<undefined> workaround in index.test.ts is safe: the class already defaults T = undefined (src/index.ts:72), and the type tests confirm it now compiles without the explicit argument.

Observations raised in the review

  1. Semantics — The public RpcPromise<T> alias changed from Stub<T> & Promise<Stubify<T>> to mirror Result's arms. These are not structurally identical (e.g. for a primitive T, the new form adds Provider<T>), so it's a genuine change to the exported type, not a pure refactor. I judged it defensible/better since RpcPromise is documented as "the result of an RPC call," but flagged that the PR body should mention the exported shape shifts slightly.

  2. Cleanup (inline suggestion)Stubify is now an unused import in index.ts (only the old definition referenced it). Neither tsconfig enables noUnusedLocals, so it slipped through. Posted a suggestion to drop it.

Overall assessment: correct and a solid improvement, with one minor unused-import nit.

github run

github-actionsBot pushed a commit to Maximo-Guk/capnweb that referenced this pull request Aug 12, 2026
Co-authored-by: teamchong <teamchong@users.noreply.github.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Maximo-Guk
Maximo-Gukforce-pushed the shared-rpc-promise-alias branch from ef5c64b to cce0eb9CompareAugust 12, 2026 15:30
@dimitropoulos
dimitropoulosforce-pushed the shared-rpc-promise-alias branch from cce0eb9 to 27b5d05CompareAugust 12, 2026 15:50
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Maximo-Guk
Maximo-Gukforce-pushed the shared-rpc-promise-alias branch from 27b5d05 to 778dd8eCompareAugust 12, 2026 16:04
@dimitropoulos
dimitropoulos merged commit 5da3786 into cloudflare:mainAug 12, 2026
5 checks passed
Maximo-Guk added a commit to cloudflare/cloudflare-os that referenced this pull request Aug 12, 2026
The typescript catalog entry moves to 7.0.2; capnweb 0.11's shared
RpcPromise alias (cloudflare/capnweb#237) removed the depth errors that
blocked this. Consumers of the JS compiler API keep a JS-based compiler:
capnweb-validate's transform gets a pinned typescript 6.0.3 dependency
via .pnpmfile.cjs (its typescript peer would otherwise resolve to 7.x,
which ships no compiler API), and the configurator build script plus the
mcp-shared schema test import the typescript6 alias. typed-storage gains
the rootDir TS7 emit requires, workshop-backend drops an Env.BROWSER
optional override TS7 rejects (use sites read BrowserRun | undefined),
and three map/filter callbacks get explicit parameter types.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Maximo-Guk added a commit to cloudflare/cloudflare-os that referenced this pull request Aug 12, 2026
The typescript catalog entry moves to 7.0.2; capnweb 0.11's shared
RpcPromise alias (cloudflare/capnweb#237) removed the depth errors that
blocked this. Consumers of the JS compiler API keep a JS-based compiler:
capnweb-validate's transform gets a pinned typescript 6.0.3 dependency
via .pnpmfile.cjs (its typescript peer would otherwise resolve to 7.x,
which ships no compiler API), and the configurator build script plus the
mcp-shared schema test import the typescript6 alias. typed-storage gains
the rootDir TS7 emit requires, workshop-backend drops an Env.BROWSER
optional override TS7 rejects (use sites read BrowserRun | undefined),
and three map/filter callbacks get explicit parameter types.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Maximo-Guk added a commit to cloudflare/cloudflare-os that referenced this pull request Aug 12, 2026
The typescript catalog entry moves to 7.0.2; capnweb 0.11's shared
RpcPromise alias (cloudflare/capnweb#237) removed the depth errors that
blocked this. Consumers of the JS compiler API keep a JS-based compiler:
capnweb-validate's transform gets a pinned typescript 6.0.3 dependency
via .pnpmfile.cjs (its typescript peer would otherwise resolve to 7.x,
which ships no compiler API), and the configurator build script plus the
mcp-shared schema test import the typescript6 alias. typed-storage gains
the rootDir TS7 emit requires, workshop-backend drops an Env.BROWSER
optional override TS7 rejects (use sites read BrowserRun | undefined),
and three map/filter callbacks get explicit parameter types.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto 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

@Maximo-Guk@teamchong@dimitropoulos
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Share one RpcPromise alias between Result and the public export - #237

Merged
dimitropoulos merged 4 commits into
cloudflare:mainfrom
Maximo-Guk:shared-rpc-promise-alias
Aug 12, 2026
Merged

Share one RpcPromise alias between Result and the public export#237
dimitropoulos merged 4 commits into
cloudflare:mainfrom
Maximo-Guk:shared-rpc-promise-alias

Conversation

@Maximo-Guk

@Maximo-GukMaximo-Guk commented Aug 12, 2026

Copy link
Copy Markdown
Member

Defines RpcPromise once in types.d.ts so Result's arms and the public export resolve to the same alias instantiation. Fixes all TypeScript 7 (tsgo) depth errors (TS2321/TS2589) with no test assertion changes, and drops 5.9 type instantiations 175,019 → 151,466 — which also makes the RpcSession<undefined> workaround in index.test.ts unnecessary.

Maximo-Gukand others added 2 commits August 12, 2026 07:38
Result's Stubable and RpcCompatible arms and the public RpcPromise built
structurally-identical intersections from different aliases, forcing the
checker through a member-by-member structural comparison of the mutually
recursive Stubify/Provider cycles. Defining RpcPromise once in types.d.ts
(conditional on Stubable, so each arm resolves to exactly the type it had
before) lets same-alias-same-args comparisons short-circuit on identity.
tsc 5.9: type-tests stay 0-error; instantiations drop 175,019 -> 151,466.
tsgo 7.0.2: all 11 depth errors in __type-tests__ and all 12 (+6 cascades)
in __tests__ at index.test.ts:808/:967/:1334 and workerd.test.ts:183
disappear; no test assertion changed.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…essary
The TODO at this site documented a TS2589 on TypeScript 5.9 when relying on
the default type argument. With Result and RpcPromise sharing one alias the
relation no longer recurses past the depth budget, so the explicit
<undefined> can go -- and staying removed is a regression canary for the
restructuring helping Strada, not just tsgo.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@changeset-bot

changeset-botBot commented Aug 12, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 778dd8e

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

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

@github-actions

github-actionsBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

All contributors have signed the CLA ✍️ ✅
Posted by the CLA Assistant Lite bot.

@pkg-pr-new

pkg-pr-newBot commented Aug 12, 2026

Copy link
Copy Markdown

Open in StackBlitz

npm i https://pkg.pr.new/cloudflare/capnweb@237

commit: 778dd8e

@Maximo-Guk
Maximo-Guk marked this pull request as ready for review August 12, 2026 15:18
@Maximo-Guk

Copy link
Copy Markdown
MemberAuthor

I have read the CLA Document and I hereby sign the CLA

github-actionsBot added a commit that referenced this pull request Aug 12, 2026
@teamchong

Copy link
Copy Markdown
Collaborator

/bonk review this

@ask-bonkask-bonkBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Review: Share one RpcPromise alias

Nice, well-motivated change. I checked out the branch and verified the claims:

  • npm run test:types (TS 5.9) passes cleanly.
  • tsc --extendedDiagnostics reports Instantiations: 151466, exactly matching the PR description (175,019 → 151,466).
  • Removing the RpcSession<undefined> workaround in index.test.ts is safe: RpcSession<T extends RpcCompatible<T> = undefined> (src/index.ts:72) already defaults to undefined, and the type tests confirm it now compiles without the explicit arg.

On the semantics of the public alias

The old public type was Stub<T> & Promise<Stubify<T>>, whereas the new alias mirrors Result's arms (Promise<...> & Provider<T> & StubBase<T>). These are not structurally identical (e.g. for a primitive T, the new form adds Provider<T>), so this is a real change to the exported type, not a pure refactor. That said, it's a defensible — arguably better — one: RpcPromise is documented as "the result of an RPC call" (src/index.ts:45), so having the public alias resolve to the same thing Result<T> produces is more accurate, and it's what actually flows out of pipelined calls. The identity short-circuit that fixes the tsgo depth errors is a nice bonus. Worth a sentence in the PR body calling out that the exported type shape shifts slightly, for anyone relying on it structurally.

One cleanup

The Stubify import in index.ts is now unused — it was only referenced by the old RpcPromise definition. Neither tsconfig enables noUnusedLocals, so it slips through, but it's dead code now.

Overall this looks correct and is a solid improvement. Just the unused-import nit below.

Comment threadsrc/index.ts Outdated
@ask-bonk

ask-bonkBot commented Aug 12, 2026

Copy link
Copy Markdown

Review posted successfully. Here's a summary of what I did and found:

Review Summary for PR #237

I checked out the branch, installed deps, and independently verified the PR's claims:

Verified ✅

  • npm run test:types (TS 5.9) passes cleanly — no assertion changes needed.
  • tsc --extendedDiagnostics reports Instantiations: 151466, matching the PR description exactly (175,019 → 151,466).
  • Removing the RpcSession<undefined> workaround in index.test.ts is safe: the class already defaults T = undefined (src/index.ts:72), and the type tests confirm it now compiles without the explicit argument.

Observations raised in the review

  1. Semantics — The public RpcPromise<T> alias changed from Stub<T> & Promise<Stubify<T>> to mirror Result's arms. These are not structurally identical (e.g. for a primitive T, the new form adds Provider<T>), so it's a genuine change to the exported type, not a pure refactor. I judged it defensible/better since RpcPromise is documented as "the result of an RPC call," but flagged that the PR body should mention the exported shape shifts slightly.

  2. Cleanup (inline suggestion)Stubify is now an unused import in index.ts (only the old definition referenced it). Neither tsconfig enables noUnusedLocals, so it slipped through. Posted a suggestion to drop it.

Overall assessment: correct and a solid improvement, with one minor unused-import nit.

github run

github-actionsBot pushed a commit to Maximo-Guk/capnweb that referenced this pull request Aug 12, 2026
Co-authored-by: teamchong <teamchong@users.noreply.github.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Maximo-Guk
Maximo-Gukforce-pushed the shared-rpc-promise-alias branch from ef5c64b to cce0eb9CompareAugust 12, 2026 15:30
@dimitropoulos
dimitropoulosforce-pushed the shared-rpc-promise-alias branch from cce0eb9 to 27b5d05CompareAugust 12, 2026 15:50
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Maximo-Guk
Maximo-Gukforce-pushed the shared-rpc-promise-alias branch from 27b5d05 to 778dd8eCompareAugust 12, 2026 16:04
@dimitropoulos
dimitropoulos merged commit 5da3786 into cloudflare:mainAug 12, 2026
5 checks passed
Maximo-Guk added a commit to cloudflare/cloudflare-os that referenced this pull request Aug 12, 2026
The typescript catalog entry moves to 7.0.2; capnweb 0.11's shared
RpcPromise alias (cloudflare/capnweb#237) removed the depth errors that
blocked this. Consumers of the JS compiler API keep a JS-based compiler:
capnweb-validate's transform gets a pinned typescript 6.0.3 dependency
via .pnpmfile.cjs (its typescript peer would otherwise resolve to 7.x,
which ships no compiler API), and the configurator build script plus the
mcp-shared schema test import the typescript6 alias. typed-storage gains
the rootDir TS7 emit requires, workshop-backend drops an Env.BROWSER
optional override TS7 rejects (use sites read BrowserRun | undefined),
and three map/filter callbacks get explicit parameter types.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Maximo-Guk added a commit to cloudflare/cloudflare-os that referenced this pull request Aug 12, 2026
The typescript catalog entry moves to 7.0.2; capnweb 0.11's shared
RpcPromise alias (cloudflare/capnweb#237) removed the depth errors that
blocked this. Consumers of the JS compiler API keep a JS-based compiler:
capnweb-validate's transform gets a pinned typescript 6.0.3 dependency
via .pnpmfile.cjs (its typescript peer would otherwise resolve to 7.x,
which ships no compiler API), and the configurator build script plus the
mcp-shared schema test import the typescript6 alias. typed-storage gains
the rootDir TS7 emit requires, workshop-backend drops an Env.BROWSER
optional override TS7 rejects (use sites read BrowserRun | undefined),
and three map/filter callbacks get explicit parameter types.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Maximo-Guk added a commit to cloudflare/cloudflare-os that referenced this pull request Aug 12, 2026
The typescript catalog entry moves to 7.0.2; capnweb 0.11's shared
RpcPromise alias (cloudflare/capnweb#237) removed the depth errors that
blocked this. Consumers of the JS compiler API keep a JS-based compiler:
capnweb-validate's transform gets a pinned typescript 6.0.3 dependency
via .pnpmfile.cjs (its typescript peer would otherwise resolve to 7.x,
which ships no compiler API), and the configurator build script plus the
mcp-shared schema test import the typescript6 alias. typed-storage gains
the rootDir TS7 emit requires, workshop-backend drops an Env.BROWSER
optional override TS7 rejects (use sites read BrowserRun | undefined),
and three map/filter callbacks get explicit parameter types.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto 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

@Maximo-Guk@teamchong@dimitropoulos
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Share one RpcPromise alias between Result and the public export - #237

Merged
dimitropoulos merged 4 commits into
cloudflare:mainfrom
Maximo-Guk:shared-rpc-promise-alias
Aug 12, 2026
Merged

Share one RpcPromise alias between Result and the public export#237
dimitropoulos merged 4 commits into
cloudflare:mainfrom
Maximo-Guk:shared-rpc-promise-alias

Conversation

@Maximo-Guk

@Maximo-GukMaximo-Guk commented Aug 12, 2026

Copy link
Copy Markdown
Member

Defines RpcPromise once in types.d.ts so Result's arms and the public export resolve to the same alias instantiation. Fixes all TypeScript 7 (tsgo) depth errors (TS2321/TS2589) with no test assertion changes, and drops 5.9 type instantiations 175,019 → 151,466 — which also makes the RpcSession<undefined> workaround in index.test.ts unnecessary.

Maximo-Gukand others added 2 commits August 12, 2026 07:38
Result's Stubable and RpcCompatible arms and the public RpcPromise built
structurally-identical intersections from different aliases, forcing the
checker through a member-by-member structural comparison of the mutually
recursive Stubify/Provider cycles. Defining RpcPromise once in types.d.ts
(conditional on Stubable, so each arm resolves to exactly the type it had
before) lets same-alias-same-args comparisons short-circuit on identity.
tsc 5.9: type-tests stay 0-error; instantiations drop 175,019 -> 151,466.
tsgo 7.0.2: all 11 depth errors in __type-tests__ and all 12 (+6 cascades)
in __tests__ at index.test.ts:808/:967/:1334 and workerd.test.ts:183
disappear; no test assertion changed.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…essary
The TODO at this site documented a TS2589 on TypeScript 5.9 when relying on
the default type argument. With Result and RpcPromise sharing one alias the
relation no longer recurses past the depth budget, so the explicit
<undefined> can go -- and staying removed is a regression canary for the
restructuring helping Strada, not just tsgo.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@changeset-bot

changeset-botBot commented Aug 12, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 778dd8e

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

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

@github-actions

github-actionsBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

All contributors have signed the CLA ✍️ ✅
Posted by the CLA Assistant Lite bot.

@pkg-pr-new

pkg-pr-newBot commented Aug 12, 2026

Copy link
Copy Markdown

Open in StackBlitz

npm i https://pkg.pr.new/cloudflare/capnweb@237

commit: 778dd8e

@Maximo-Guk
Maximo-Guk marked this pull request as ready for review August 12, 2026 15:18
@Maximo-Guk

Copy link
Copy Markdown
MemberAuthor

I have read the CLA Document and I hereby sign the CLA

github-actionsBot added a commit that referenced this pull request Aug 12, 2026
@teamchong

Copy link
Copy Markdown
Collaborator

/bonk review this

@ask-bonkask-bonkBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Review: Share one RpcPromise alias

Nice, well-motivated change. I checked out the branch and verified the claims:

  • npm run test:types (TS 5.9) passes cleanly.
  • tsc --extendedDiagnostics reports Instantiations: 151466, exactly matching the PR description (175,019 → 151,466).
  • Removing the RpcSession<undefined> workaround in index.test.ts is safe: RpcSession<T extends RpcCompatible<T> = undefined> (src/index.ts:72) already defaults to undefined, and the type tests confirm it now compiles without the explicit arg.

On the semantics of the public alias

The old public type was Stub<T> & Promise<Stubify<T>>, whereas the new alias mirrors Result's arms (Promise<...> & Provider<T> & StubBase<T>). These are not structurally identical (e.g. for a primitive T, the new form adds Provider<T>), so this is a real change to the exported type, not a pure refactor. That said, it's a defensible — arguably better — one: RpcPromise is documented as "the result of an RPC call" (src/index.ts:45), so having the public alias resolve to the same thing Result<T> produces is more accurate, and it's what actually flows out of pipelined calls. The identity short-circuit that fixes the tsgo depth errors is a nice bonus. Worth a sentence in the PR body calling out that the exported type shape shifts slightly, for anyone relying on it structurally.

One cleanup

The Stubify import in index.ts is now unused — it was only referenced by the old RpcPromise definition. Neither tsconfig enables noUnusedLocals, so it slips through, but it's dead code now.

Overall this looks correct and is a solid improvement. Just the unused-import nit below.

Comment threadsrc/index.ts Outdated
@ask-bonk

ask-bonkBot commented Aug 12, 2026

Copy link
Copy Markdown

Review posted successfully. Here's a summary of what I did and found:

Review Summary for PR #237

I checked out the branch, installed deps, and independently verified the PR's claims:

Verified ✅

  • npm run test:types (TS 5.9) passes cleanly — no assertion changes needed.
  • tsc --extendedDiagnostics reports Instantiations: 151466, matching the PR description exactly (175,019 → 151,466).
  • Removing the RpcSession<undefined> workaround in index.test.ts is safe: the class already defaults T = undefined (src/index.ts:72), and the type tests confirm it now compiles without the explicit argument.

Observations raised in the review

  1. Semantics — The public RpcPromise<T> alias changed from Stub<T> & Promise<Stubify<T>> to mirror Result's arms. These are not structurally identical (e.g. for a primitive T, the new form adds Provider<T>), so it's a genuine change to the exported type, not a pure refactor. I judged it defensible/better since RpcPromise is documented as "the result of an RPC call," but flagged that the PR body should mention the exported shape shifts slightly.

  2. Cleanup (inline suggestion)Stubify is now an unused import in index.ts (only the old definition referenced it). Neither tsconfig enables noUnusedLocals, so it slipped through. Posted a suggestion to drop it.

Overall assessment: correct and a solid improvement, with one minor unused-import nit.

github run

github-actionsBot pushed a commit to Maximo-Guk/capnweb that referenced this pull request Aug 12, 2026
Co-authored-by: teamchong <teamchong@users.noreply.github.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Maximo-Guk
Maximo-Gukforce-pushed the shared-rpc-promise-alias branch from ef5c64b to cce0eb9CompareAugust 12, 2026 15:30
@dimitropoulos
dimitropoulosforce-pushed the shared-rpc-promise-alias branch from cce0eb9 to 27b5d05CompareAugust 12, 2026 15:50
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Maximo-Guk
Maximo-Gukforce-pushed the shared-rpc-promise-alias branch from 27b5d05 to 778dd8eCompareAugust 12, 2026 16:04
@dimitropoulos
dimitropoulos merged commit 5da3786 into cloudflare:mainAug 12, 2026
5 checks passed
Maximo-Guk added a commit to cloudflare/cloudflare-os that referenced this pull request Aug 12, 2026
The typescript catalog entry moves to 7.0.2; capnweb 0.11's shared
RpcPromise alias (cloudflare/capnweb#237) removed the depth errors that
blocked this. Consumers of the JS compiler API keep a JS-based compiler:
capnweb-validate's transform gets a pinned typescript 6.0.3 dependency
via .pnpmfile.cjs (its typescript peer would otherwise resolve to 7.x,
which ships no compiler API), and the configurator build script plus the
mcp-shared schema test import the typescript6 alias. typed-storage gains
the rootDir TS7 emit requires, workshop-backend drops an Env.BROWSER
optional override TS7 rejects (use sites read BrowserRun | undefined),
and three map/filter callbacks get explicit parameter types.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Maximo-Guk added a commit to cloudflare/cloudflare-os that referenced this pull request Aug 12, 2026
The typescript catalog entry moves to 7.0.2; capnweb 0.11's shared
RpcPromise alias (cloudflare/capnweb#237) removed the depth errors that
blocked this. Consumers of the JS compiler API keep a JS-based compiler:
capnweb-validate's transform gets a pinned typescript 6.0.3 dependency
via .pnpmfile.cjs (its typescript peer would otherwise resolve to 7.x,
which ships no compiler API), and the configurator build script plus the
mcp-shared schema test import the typescript6 alias. typed-storage gains
the rootDir TS7 emit requires, workshop-backend drops an Env.BROWSER
optional override TS7 rejects (use sites read BrowserRun | undefined),
and three map/filter callbacks get explicit parameter types.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Maximo-Guk added a commit to cloudflare/cloudflare-os that referenced this pull request Aug 12, 2026
The typescript catalog entry moves to 7.0.2; capnweb 0.11's shared
RpcPromise alias (cloudflare/capnweb#237) removed the depth errors that
blocked this. Consumers of the JS compiler API keep a JS-based compiler:
capnweb-validate's transform gets a pinned typescript 6.0.3 dependency
via .pnpmfile.cjs (its typescript peer would otherwise resolve to 7.x,
which ships no compiler API), and the configurator build script plus the
mcp-shared schema test import the typescript6 alias. typed-storage gains
the rootDir TS7 emit requires, workshop-backend drops an Env.BROWSER
optional override TS7 rejects (use sites read BrowserRun | undefined),
and three map/filter callbacks get explicit parameter types.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto 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

@Maximo-Guk@teamchong@dimitropoulos
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Share one RpcPromise alias between Result and the public export - #237

Merged
dimitropoulos merged 4 commits into
cloudflare:mainfrom
Maximo-Guk:shared-rpc-promise-alias
Aug 12, 2026
Merged

Share one RpcPromise alias between Result and the public export#237
dimitropoulos merged 4 commits into
cloudflare:mainfrom
Maximo-Guk:shared-rpc-promise-alias

Conversation

@Maximo-Guk

@Maximo-GukMaximo-Guk commented Aug 12, 2026

Copy link
Copy Markdown
Member

Defines RpcPromise once in types.d.ts so Result's arms and the public export resolve to the same alias instantiation. Fixes all TypeScript 7 (tsgo) depth errors (TS2321/TS2589) with no test assertion changes, and drops 5.9 type instantiations 175,019 → 151,466 — which also makes the RpcSession<undefined> workaround in index.test.ts unnecessary.

Maximo-Gukand others added 2 commits August 12, 2026 07:38
Result's Stubable and RpcCompatible arms and the public RpcPromise built
structurally-identical intersections from different aliases, forcing the
checker through a member-by-member structural comparison of the mutually
recursive Stubify/Provider cycles. Defining RpcPromise once in types.d.ts
(conditional on Stubable, so each arm resolves to exactly the type it had
before) lets same-alias-same-args comparisons short-circuit on identity.
tsc 5.9: type-tests stay 0-error; instantiations drop 175,019 -> 151,466.
tsgo 7.0.2: all 11 depth errors in __type-tests__ and all 12 (+6 cascades)
in __tests__ at index.test.ts:808/:967/:1334 and workerd.test.ts:183
disappear; no test assertion changed.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…essary
The TODO at this site documented a TS2589 on TypeScript 5.9 when relying on
the default type argument. With Result and RpcPromise sharing one alias the
relation no longer recurses past the depth budget, so the explicit
<undefined> can go -- and staying removed is a regression canary for the
restructuring helping Strada, not just tsgo.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@changeset-bot

changeset-botBot commented Aug 12, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 778dd8e

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

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

@github-actions

github-actionsBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

All contributors have signed the CLA ✍️ ✅
Posted by the CLA Assistant Lite bot.

@pkg-pr-new

pkg-pr-newBot commented Aug 12, 2026

Copy link
Copy Markdown

Open in StackBlitz

npm i https://pkg.pr.new/cloudflare/capnweb@237

commit: 778dd8e

@Maximo-Guk
Maximo-Guk marked this pull request as ready for review August 12, 2026 15:18
@Maximo-Guk

Copy link
Copy Markdown
MemberAuthor

I have read the CLA Document and I hereby sign the CLA

github-actionsBot added a commit that referenced this pull request Aug 12, 2026
@teamchong

Copy link
Copy Markdown
Collaborator

/bonk review this

@ask-bonkask-bonkBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Review: Share one RpcPromise alias

Nice, well-motivated change. I checked out the branch and verified the claims:

  • npm run test:types (TS 5.9) passes cleanly.
  • tsc --extendedDiagnostics reports Instantiations: 151466, exactly matching the PR description (175,019 → 151,466).
  • Removing the RpcSession<undefined> workaround in index.test.ts is safe: RpcSession<T extends RpcCompatible<T> = undefined> (src/index.ts:72) already defaults to undefined, and the type tests confirm it now compiles without the explicit arg.

On the semantics of the public alias

The old public type was Stub<T> & Promise<Stubify<T>>, whereas the new alias mirrors Result's arms (Promise<...> & Provider<T> & StubBase<T>). These are not structurally identical (e.g. for a primitive T, the new form adds Provider<T>), so this is a real change to the exported type, not a pure refactor. That said, it's a defensible — arguably better — one: RpcPromise is documented as "the result of an RPC call" (src/index.ts:45), so having the public alias resolve to the same thing Result<T> produces is more accurate, and it's what actually flows out of pipelined calls. The identity short-circuit that fixes the tsgo depth errors is a nice bonus. Worth a sentence in the PR body calling out that the exported type shape shifts slightly, for anyone relying on it structurally.

One cleanup

The Stubify import in index.ts is now unused — it was only referenced by the old RpcPromise definition. Neither tsconfig enables noUnusedLocals, so it slips through, but it's dead code now.

Overall this looks correct and is a solid improvement. Just the unused-import nit below.

Comment threadsrc/index.ts Outdated
@ask-bonk

ask-bonkBot commented Aug 12, 2026

Copy link
Copy Markdown

Review posted successfully. Here's a summary of what I did and found:

Review Summary for PR #237

I checked out the branch, installed deps, and independently verified the PR's claims:

Verified ✅

  • npm run test:types (TS 5.9) passes cleanly — no assertion changes needed.
  • tsc --extendedDiagnostics reports Instantiations: 151466, matching the PR description exactly (175,019 → 151,466).
  • Removing the RpcSession<undefined> workaround in index.test.ts is safe: the class already defaults T = undefined (src/index.ts:72), and the type tests confirm it now compiles without the explicit argument.

Observations raised in the review

  1. Semantics — The public RpcPromise<T> alias changed from Stub<T> & Promise<Stubify<T>> to mirror Result's arms. These are not structurally identical (e.g. for a primitive T, the new form adds Provider<T>), so it's a genuine change to the exported type, not a pure refactor. I judged it defensible/better since RpcPromise is documented as "the result of an RPC call," but flagged that the PR body should mention the exported shape shifts slightly.

  2. Cleanup (inline suggestion)Stubify is now an unused import in index.ts (only the old definition referenced it). Neither tsconfig enables noUnusedLocals, so it slipped through. Posted a suggestion to drop it.

Overall assessment: correct and a solid improvement, with one minor unused-import nit.

github run

github-actionsBot pushed a commit to Maximo-Guk/capnweb that referenced this pull request Aug 12, 2026
Co-authored-by: teamchong <teamchong@users.noreply.github.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Maximo-Guk
Maximo-Gukforce-pushed the shared-rpc-promise-alias branch from ef5c64b to cce0eb9CompareAugust 12, 2026 15:30
@dimitropoulos
dimitropoulosforce-pushed the shared-rpc-promise-alias branch from cce0eb9 to 27b5d05CompareAugust 12, 2026 15:50
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Maximo-Guk
Maximo-Gukforce-pushed the shared-rpc-promise-alias branch from 27b5d05 to 778dd8eCompareAugust 12, 2026 16:04
@dimitropoulos
dimitropoulos merged commit 5da3786 into cloudflare:mainAug 12, 2026
5 checks passed
Maximo-Guk added a commit to cloudflare/cloudflare-os that referenced this pull request Aug 12, 2026
The typescript catalog entry moves to 7.0.2; capnweb 0.11's shared
RpcPromise alias (cloudflare/capnweb#237) removed the depth errors that
blocked this. Consumers of the JS compiler API keep a JS-based compiler:
capnweb-validate's transform gets a pinned typescript 6.0.3 dependency
via .pnpmfile.cjs (its typescript peer would otherwise resolve to 7.x,
which ships no compiler API), and the configurator build script plus the
mcp-shared schema test import the typescript6 alias. typed-storage gains
the rootDir TS7 emit requires, workshop-backend drops an Env.BROWSER
optional override TS7 rejects (use sites read BrowserRun | undefined),
and three map/filter callbacks get explicit parameter types.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Maximo-Guk added a commit to cloudflare/cloudflare-os that referenced this pull request Aug 12, 2026
The typescript catalog entry moves to 7.0.2; capnweb 0.11's shared
RpcPromise alias (cloudflare/capnweb#237) removed the depth errors that
blocked this. Consumers of the JS compiler API keep a JS-based compiler:
capnweb-validate's transform gets a pinned typescript 6.0.3 dependency
via .pnpmfile.cjs (its typescript peer would otherwise resolve to 7.x,
which ships no compiler API), and the configurator build script plus the
mcp-shared schema test import the typescript6 alias. typed-storage gains
the rootDir TS7 emit requires, workshop-backend drops an Env.BROWSER
optional override TS7 rejects (use sites read BrowserRun | undefined),
and three map/filter callbacks get explicit parameter types.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Maximo-Guk added a commit to cloudflare/cloudflare-os that referenced this pull request Aug 12, 2026
The typescript catalog entry moves to 7.0.2; capnweb 0.11's shared
RpcPromise alias (cloudflare/capnweb#237) removed the depth errors that
blocked this. Consumers of the JS compiler API keep a JS-based compiler:
capnweb-validate's transform gets a pinned typescript 6.0.3 dependency
via .pnpmfile.cjs (its typescript peer would otherwise resolve to 7.x,
which ships no compiler API), and the configurator build script plus the
mcp-shared schema test import the typescript6 alias. typed-storage gains
the rootDir TS7 emit requires, workshop-backend drops an Env.BROWSER
optional override TS7 rejects (use sites read BrowserRun | undefined),
and three map/filter callbacks get explicit parameter types.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto 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

@Maximo-Guk@teamchong@dimitropoulos
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Share one RpcPromise alias between Result and the public export - #237

Merged
dimitropoulos merged 4 commits into
cloudflare:mainfrom
Maximo-Guk:shared-rpc-promise-alias
Aug 12, 2026
Merged

Share one RpcPromise alias between Result and the public export#237
dimitropoulos merged 4 commits into
cloudflare:mainfrom
Maximo-Guk:shared-rpc-promise-alias

Conversation

@Maximo-Guk

@Maximo-GukMaximo-Guk commented Aug 12, 2026

Copy link
Copy Markdown
Member

Defines RpcPromise once in types.d.ts so Result's arms and the public export resolve to the same alias instantiation. Fixes all TypeScript 7 (tsgo) depth errors (TS2321/TS2589) with no test assertion changes, and drops 5.9 type instantiations 175,019 → 151,466 — which also makes the RpcSession<undefined> workaround in index.test.ts unnecessary.

Maximo-Gukand others added 2 commits August 12, 2026 07:38
Result's Stubable and RpcCompatible arms and the public RpcPromise built
structurally-identical intersections from different aliases, forcing the
checker through a member-by-member structural comparison of the mutually
recursive Stubify/Provider cycles. Defining RpcPromise once in types.d.ts
(conditional on Stubable, so each arm resolves to exactly the type it had
before) lets same-alias-same-args comparisons short-circuit on identity.
tsc 5.9: type-tests stay 0-error; instantiations drop 175,019 -> 151,466.
tsgo 7.0.2: all 11 depth errors in __type-tests__ and all 12 (+6 cascades)
in __tests__ at index.test.ts:808/:967/:1334 and workerd.test.ts:183
disappear; no test assertion changed.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…essary
The TODO at this site documented a TS2589 on TypeScript 5.9 when relying on
the default type argument. With Result and RpcPromise sharing one alias the
relation no longer recurses past the depth budget, so the explicit
<undefined> can go -- and staying removed is a regression canary for the
restructuring helping Strada, not just tsgo.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@changeset-bot

changeset-botBot commented Aug 12, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 778dd8e

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

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

@github-actions

github-actionsBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

All contributors have signed the CLA ✍️ ✅
Posted by the CLA Assistant Lite bot.

@pkg-pr-new

pkg-pr-newBot commented Aug 12, 2026

Copy link
Copy Markdown

Open in StackBlitz

npm i https://pkg.pr.new/cloudflare/capnweb@237

commit: 778dd8e

@Maximo-Guk
Maximo-Guk marked this pull request as ready for review August 12, 2026 15:18
@Maximo-Guk

Copy link
Copy Markdown
MemberAuthor

I have read the CLA Document and I hereby sign the CLA

github-actionsBot added a commit that referenced this pull request Aug 12, 2026
@teamchong

Copy link
Copy Markdown
Collaborator

/bonk review this

@ask-bonkask-bonkBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Review: Share one RpcPromise alias

Nice, well-motivated change. I checked out the branch and verified the claims:

  • npm run test:types (TS 5.9) passes cleanly.
  • tsc --extendedDiagnostics reports Instantiations: 151466, exactly matching the PR description (175,019 → 151,466).
  • Removing the RpcSession<undefined> workaround in index.test.ts is safe: RpcSession<T extends RpcCompatible<T> = undefined> (src/index.ts:72) already defaults to undefined, and the type tests confirm it now compiles without the explicit arg.

On the semantics of the public alias

The old public type was Stub<T> & Promise<Stubify<T>>, whereas the new alias mirrors Result's arms (Promise<...> & Provider<T> & StubBase<T>). These are not structurally identical (e.g. for a primitive T, the new form adds Provider<T>), so this is a real change to the exported type, not a pure refactor. That said, it's a defensible — arguably better — one: RpcPromise is documented as "the result of an RPC call" (src/index.ts:45), so having the public alias resolve to the same thing Result<T> produces is more accurate, and it's what actually flows out of pipelined calls. The identity short-circuit that fixes the tsgo depth errors is a nice bonus. Worth a sentence in the PR body calling out that the exported type shape shifts slightly, for anyone relying on it structurally.

One cleanup

The Stubify import in index.ts is now unused — it was only referenced by the old RpcPromise definition. Neither tsconfig enables noUnusedLocals, so it slips through, but it's dead code now.

Overall this looks correct and is a solid improvement. Just the unused-import nit below.

Comment threadsrc/index.ts Outdated
@ask-bonk

ask-bonkBot commented Aug 12, 2026

Copy link
Copy Markdown

Review posted successfully. Here's a summary of what I did and found:

Review Summary for PR #237

I checked out the branch, installed deps, and independently verified the PR's claims:

Verified ✅

  • npm run test:types (TS 5.9) passes cleanly — no assertion changes needed.
  • tsc --extendedDiagnostics reports Instantiations: 151466, matching the PR description exactly (175,019 → 151,466).
  • Removing the RpcSession<undefined> workaround in index.test.ts is safe: the class already defaults T = undefined (src/index.ts:72), and the type tests confirm it now compiles without the explicit argument.

Observations raised in the review

  1. Semantics — The public RpcPromise<T> alias changed from Stub<T> & Promise<Stubify<T>> to mirror Result's arms. These are not structurally identical (e.g. for a primitive T, the new form adds Provider<T>), so it's a genuine change to the exported type, not a pure refactor. I judged it defensible/better since RpcPromise is documented as "the result of an RPC call," but flagged that the PR body should mention the exported shape shifts slightly.

  2. Cleanup (inline suggestion)Stubify is now an unused import in index.ts (only the old definition referenced it). Neither tsconfig enables noUnusedLocals, so it slipped through. Posted a suggestion to drop it.

Overall assessment: correct and a solid improvement, with one minor unused-import nit.

github run

github-actionsBot pushed a commit to Maximo-Guk/capnweb that referenced this pull request Aug 12, 2026
Co-authored-by: teamchong <teamchong@users.noreply.github.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Maximo-Guk
Maximo-Gukforce-pushed the shared-rpc-promise-alias branch from ef5c64b to cce0eb9CompareAugust 12, 2026 15:30
@dimitropoulos
dimitropoulosforce-pushed the shared-rpc-promise-alias branch from cce0eb9 to 27b5d05CompareAugust 12, 2026 15:50
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Maximo-Guk
Maximo-Gukforce-pushed the shared-rpc-promise-alias branch from 27b5d05 to 778dd8eCompareAugust 12, 2026 16:04
@dimitropoulos
dimitropoulos merged commit 5da3786 into cloudflare:mainAug 12, 2026
5 checks passed
Maximo-Guk added a commit to cloudflare/cloudflare-os that referenced this pull request Aug 12, 2026
The typescript catalog entry moves to 7.0.2; capnweb 0.11's shared
RpcPromise alias (cloudflare/capnweb#237) removed the depth errors that
blocked this. Consumers of the JS compiler API keep a JS-based compiler:
capnweb-validate's transform gets a pinned typescript 6.0.3 dependency
via .pnpmfile.cjs (its typescript peer would otherwise resolve to 7.x,
which ships no compiler API), and the configurator build script plus the
mcp-shared schema test import the typescript6 alias. typed-storage gains
the rootDir TS7 emit requires, workshop-backend drops an Env.BROWSER
optional override TS7 rejects (use sites read BrowserRun | undefined),
and three map/filter callbacks get explicit parameter types.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Maximo-Guk added a commit to cloudflare/cloudflare-os that referenced this pull request Aug 12, 2026
The typescript catalog entry moves to 7.0.2; capnweb 0.11's shared
RpcPromise alias (cloudflare/capnweb#237) removed the depth errors that
blocked this. Consumers of the JS compiler API keep a JS-based compiler:
capnweb-validate's transform gets a pinned typescript 6.0.3 dependency
via .pnpmfile.cjs (its typescript peer would otherwise resolve to 7.x,
which ships no compiler API), and the configurator build script plus the
mcp-shared schema test import the typescript6 alias. typed-storage gains
the rootDir TS7 emit requires, workshop-backend drops an Env.BROWSER
optional override TS7 rejects (use sites read BrowserRun | undefined),
and three map/filter callbacks get explicit parameter types.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Maximo-Guk added a commit to cloudflare/cloudflare-os that referenced this pull request Aug 12, 2026
The typescript catalog entry moves to 7.0.2; capnweb 0.11's shared
RpcPromise alias (cloudflare/capnweb#237) removed the depth errors that
blocked this. Consumers of the JS compiler API keep a JS-based compiler:
capnweb-validate's transform gets a pinned typescript 6.0.3 dependency
via .pnpmfile.cjs (its typescript peer would otherwise resolve to 7.x,
which ships no compiler API), and the configurator build script plus the
mcp-shared schema test import the typescript6 alias. typed-storage gains
the rootDir TS7 emit requires, workshop-backend drops an Env.BROWSER
optional override TS7 rejects (use sites read BrowserRun | undefined),
and three map/filter callbacks get explicit parameter types.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto 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

@Maximo-Guk@teamchong@dimitropoulos
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Share one RpcPromise alias between Result and the public export - #237

Merged
dimitropoulos merged 4 commits into
cloudflare:mainfrom
Maximo-Guk:shared-rpc-promise-alias
Aug 12, 2026
Merged

Share one RpcPromise alias between Result and the public export#237
dimitropoulos merged 4 commits into
cloudflare:mainfrom
Maximo-Guk:shared-rpc-promise-alias

Conversation

@Maximo-Guk

@Maximo-GukMaximo-Guk commented Aug 12, 2026

Copy link
Copy Markdown
Member

Defines RpcPromise once in types.d.ts so Result's arms and the public export resolve to the same alias instantiation. Fixes all TypeScript 7 (tsgo) depth errors (TS2321/TS2589) with no test assertion changes, and drops 5.9 type instantiations 175,019 → 151,466 — which also makes the RpcSession<undefined> workaround in index.test.ts unnecessary.

Maximo-Gukand others added 2 commits August 12, 2026 07:38
Result's Stubable and RpcCompatible arms and the public RpcPromise built
structurally-identical intersections from different aliases, forcing the
checker through a member-by-member structural comparison of the mutually
recursive Stubify/Provider cycles. Defining RpcPromise once in types.d.ts
(conditional on Stubable, so each arm resolves to exactly the type it had
before) lets same-alias-same-args comparisons short-circuit on identity.
tsc 5.9: type-tests stay 0-error; instantiations drop 175,019 -> 151,466.
tsgo 7.0.2: all 11 depth errors in __type-tests__ and all 12 (+6 cascades)
in __tests__ at index.test.ts:808/:967/:1334 and workerd.test.ts:183
disappear; no test assertion changed.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…essary
The TODO at this site documented a TS2589 on TypeScript 5.9 when relying on
the default type argument. With Result and RpcPromise sharing one alias the
relation no longer recurses past the depth budget, so the explicit
<undefined> can go -- and staying removed is a regression canary for the
restructuring helping Strada, not just tsgo.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@changeset-bot

changeset-botBot commented Aug 12, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 778dd8e

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

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

@github-actions

github-actionsBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

All contributors have signed the CLA ✍️ ✅
Posted by the CLA Assistant Lite bot.

@pkg-pr-new

pkg-pr-newBot commented Aug 12, 2026

Copy link
Copy Markdown

Open in StackBlitz

npm i https://pkg.pr.new/cloudflare/capnweb@237

commit: 778dd8e

@Maximo-Guk
Maximo-Guk marked this pull request as ready for review August 12, 2026 15:18
@Maximo-Guk

Copy link
Copy Markdown
MemberAuthor

I have read the CLA Document and I hereby sign the CLA

github-actionsBot added a commit that referenced this pull request Aug 12, 2026
@teamchong

Copy link
Copy Markdown
Collaborator

/bonk review this

@ask-bonkask-bonkBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Review: Share one RpcPromise alias

Nice, well-motivated change. I checked out the branch and verified the claims:

  • npm run test:types (TS 5.9) passes cleanly.
  • tsc --extendedDiagnostics reports Instantiations: 151466, exactly matching the PR description (175,019 → 151,466).
  • Removing the RpcSession<undefined> workaround in index.test.ts is safe: RpcSession<T extends RpcCompatible<T> = undefined> (src/index.ts:72) already defaults to undefined, and the type tests confirm it now compiles without the explicit arg.

On the semantics of the public alias

The old public type was Stub<T> & Promise<Stubify<T>>, whereas the new alias mirrors Result's arms (Promise<...> & Provider<T> & StubBase<T>). These are not structurally identical (e.g. for a primitive T, the new form adds Provider<T>), so this is a real change to the exported type, not a pure refactor. That said, it's a defensible — arguably better — one: RpcPromise is documented as "the result of an RPC call" (src/index.ts:45), so having the public alias resolve to the same thing Result<T> produces is more accurate, and it's what actually flows out of pipelined calls. The identity short-circuit that fixes the tsgo depth errors is a nice bonus. Worth a sentence in the PR body calling out that the exported type shape shifts slightly, for anyone relying on it structurally.

One cleanup

The Stubify import in index.ts is now unused — it was only referenced by the old RpcPromise definition. Neither tsconfig enables noUnusedLocals, so it slips through, but it's dead code now.

Overall this looks correct and is a solid improvement. Just the unused-import nit below.

Comment threadsrc/index.ts Outdated
@ask-bonk

ask-bonkBot commented Aug 12, 2026

Copy link
Copy Markdown

Review posted successfully. Here's a summary of what I did and found:

Review Summary for PR #237

I checked out the branch, installed deps, and independently verified the PR's claims:

Verified ✅

  • npm run test:types (TS 5.9) passes cleanly — no assertion changes needed.
  • tsc --extendedDiagnostics reports Instantiations: 151466, matching the PR description exactly (175,019 → 151,466).
  • Removing the RpcSession<undefined> workaround in index.test.ts is safe: the class already defaults T = undefined (src/index.ts:72), and the type tests confirm it now compiles without the explicit argument.

Observations raised in the review

  1. Semantics — The public RpcPromise<T> alias changed from Stub<T> & Promise<Stubify<T>> to mirror Result's arms. These are not structurally identical (e.g. for a primitive T, the new form adds Provider<T>), so it's a genuine change to the exported type, not a pure refactor. I judged it defensible/better since RpcPromise is documented as "the result of an RPC call," but flagged that the PR body should mention the exported shape shifts slightly.

  2. Cleanup (inline suggestion)Stubify is now an unused import in index.ts (only the old definition referenced it). Neither tsconfig enables noUnusedLocals, so it slipped through. Posted a suggestion to drop it.

Overall assessment: correct and a solid improvement, with one minor unused-import nit.

github run

github-actionsBot pushed a commit to Maximo-Guk/capnweb that referenced this pull request Aug 12, 2026
Co-authored-by: teamchong <teamchong@users.noreply.github.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Maximo-Guk
Maximo-Gukforce-pushed the shared-rpc-promise-alias branch from ef5c64b to cce0eb9CompareAugust 12, 2026 15:30
@dimitropoulos
dimitropoulosforce-pushed the shared-rpc-promise-alias branch from cce0eb9 to 27b5d05CompareAugust 12, 2026 15:50
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Maximo-Guk
Maximo-Gukforce-pushed the shared-rpc-promise-alias branch from 27b5d05 to 778dd8eCompareAugust 12, 2026 16:04
@dimitropoulos
dimitropoulos merged commit 5da3786 into cloudflare:mainAug 12, 2026
5 checks passed
Maximo-Guk added a commit to cloudflare/cloudflare-os that referenced this pull request Aug 12, 2026
The typescript catalog entry moves to 7.0.2; capnweb 0.11's shared
RpcPromise alias (cloudflare/capnweb#237) removed the depth errors that
blocked this. Consumers of the JS compiler API keep a JS-based compiler:
capnweb-validate's transform gets a pinned typescript 6.0.3 dependency
via .pnpmfile.cjs (its typescript peer would otherwise resolve to 7.x,
which ships no compiler API), and the configurator build script plus the
mcp-shared schema test import the typescript6 alias. typed-storage gains
the rootDir TS7 emit requires, workshop-backend drops an Env.BROWSER
optional override TS7 rejects (use sites read BrowserRun | undefined),
and three map/filter callbacks get explicit parameter types.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Maximo-Guk added a commit to cloudflare/cloudflare-os that referenced this pull request Aug 12, 2026
The typescript catalog entry moves to 7.0.2; capnweb 0.11's shared
RpcPromise alias (cloudflare/capnweb#237) removed the depth errors that
blocked this. Consumers of the JS compiler API keep a JS-based compiler:
capnweb-validate's transform gets a pinned typescript 6.0.3 dependency
via .pnpmfile.cjs (its typescript peer would otherwise resolve to 7.x,
which ships no compiler API), and the configurator build script plus the
mcp-shared schema test import the typescript6 alias. typed-storage gains
the rootDir TS7 emit requires, workshop-backend drops an Env.BROWSER
optional override TS7 rejects (use sites read BrowserRun | undefined),
and three map/filter callbacks get explicit parameter types.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Maximo-Guk added a commit to cloudflare/cloudflare-os that referenced this pull request Aug 12, 2026
The typescript catalog entry moves to 7.0.2; capnweb 0.11's shared
RpcPromise alias (cloudflare/capnweb#237) removed the depth errors that
blocked this. Consumers of the JS compiler API keep a JS-based compiler:
capnweb-validate's transform gets a pinned typescript 6.0.3 dependency
via .pnpmfile.cjs (its typescript peer would otherwise resolve to 7.x,
which ships no compiler API), and the configurator build script plus the
mcp-shared schema test import the typescript6 alias. typed-storage gains
the rootDir TS7 emit requires, workshop-backend drops an Env.BROWSER
optional override TS7 rejects (use sites read BrowserRun | undefined),
and three map/filter callbacks get explicit parameter types.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto 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

@Maximo-Guk@teamchong@dimitropoulos
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Share one RpcPromise alias between Result and the public export - #237

Merged
dimitropoulos merged 4 commits into
cloudflare:mainfrom
Maximo-Guk:shared-rpc-promise-alias
Aug 12, 2026
Merged

Share one RpcPromise alias between Result and the public export#237
dimitropoulos merged 4 commits into
cloudflare:mainfrom
Maximo-Guk:shared-rpc-promise-alias

Conversation

@Maximo-Guk

@Maximo-GukMaximo-Guk commented Aug 12, 2026

Copy link
Copy Markdown
Member

Defines RpcPromise once in types.d.ts so Result's arms and the public export resolve to the same alias instantiation. Fixes all TypeScript 7 (tsgo) depth errors (TS2321/TS2589) with no test assertion changes, and drops 5.9 type instantiations 175,019 → 151,466 — which also makes the RpcSession<undefined> workaround in index.test.ts unnecessary.

Maximo-Gukand others added 2 commits August 12, 2026 07:38
Result's Stubable and RpcCompatible arms and the public RpcPromise built
structurally-identical intersections from different aliases, forcing the
checker through a member-by-member structural comparison of the mutually
recursive Stubify/Provider cycles. Defining RpcPromise once in types.d.ts
(conditional on Stubable, so each arm resolves to exactly the type it had
before) lets same-alias-same-args comparisons short-circuit on identity.
tsc 5.9: type-tests stay 0-error; instantiations drop 175,019 -> 151,466.
tsgo 7.0.2: all 11 depth errors in __type-tests__ and all 12 (+6 cascades)
in __tests__ at index.test.ts:808/:967/:1334 and workerd.test.ts:183
disappear; no test assertion changed.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…essary
The TODO at this site documented a TS2589 on TypeScript 5.9 when relying on
the default type argument. With Result and RpcPromise sharing one alias the
relation no longer recurses past the depth budget, so the explicit
<undefined> can go -- and staying removed is a regression canary for the
restructuring helping Strada, not just tsgo.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@changeset-bot

changeset-botBot commented Aug 12, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 778dd8e

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

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

@github-actions

github-actionsBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

All contributors have signed the CLA ✍️ ✅
Posted by the CLA Assistant Lite bot.

@pkg-pr-new

pkg-pr-newBot commented Aug 12, 2026

Copy link
Copy Markdown

Open in StackBlitz

npm i https://pkg.pr.new/cloudflare/capnweb@237

commit: 778dd8e

@Maximo-Guk
Maximo-Guk marked this pull request as ready for review August 12, 2026 15:18
@Maximo-Guk

Copy link
Copy Markdown
MemberAuthor

I have read the CLA Document and I hereby sign the CLA

github-actionsBot added a commit that referenced this pull request Aug 12, 2026
@teamchong

Copy link
Copy Markdown
Collaborator

/bonk review this

@ask-bonkask-bonkBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Review: Share one RpcPromise alias

Nice, well-motivated change. I checked out the branch and verified the claims:

  • npm run test:types (TS 5.9) passes cleanly.
  • tsc --extendedDiagnostics reports Instantiations: 151466, exactly matching the PR description (175,019 → 151,466).
  • Removing the RpcSession<undefined> workaround in index.test.ts is safe: RpcSession<T extends RpcCompatible<T> = undefined> (src/index.ts:72) already defaults to undefined, and the type tests confirm it now compiles without the explicit arg.

On the semantics of the public alias

The old public type was Stub<T> & Promise<Stubify<T>>, whereas the new alias mirrors Result's arms (Promise<...> & Provider<T> & StubBase<T>). These are not structurally identical (e.g. for a primitive T, the new form adds Provider<T>), so this is a real change to the exported type, not a pure refactor. That said, it's a defensible — arguably better — one: RpcPromise is documented as "the result of an RPC call" (src/index.ts:45), so having the public alias resolve to the same thing Result<T> produces is more accurate, and it's what actually flows out of pipelined calls. The identity short-circuit that fixes the tsgo depth errors is a nice bonus. Worth a sentence in the PR body calling out that the exported type shape shifts slightly, for anyone relying on it structurally.

One cleanup

The Stubify import in index.ts is now unused — it was only referenced by the old RpcPromise definition. Neither tsconfig enables noUnusedLocals, so it slips through, but it's dead code now.

Overall this looks correct and is a solid improvement. Just the unused-import nit below.

Comment threadsrc/index.ts Outdated
@ask-bonk

ask-bonkBot commented Aug 12, 2026

Copy link
Copy Markdown

Review posted successfully. Here's a summary of what I did and found:

Review Summary for PR #237

I checked out the branch, installed deps, and independently verified the PR's claims:

Verified ✅

  • npm run test:types (TS 5.9) passes cleanly — no assertion changes needed.
  • tsc --extendedDiagnostics reports Instantiations: 151466, matching the PR description exactly (175,019 → 151,466).
  • Removing the RpcSession<undefined> workaround in index.test.ts is safe: the class already defaults T = undefined (src/index.ts:72), and the type tests confirm it now compiles without the explicit argument.

Observations raised in the review

  1. Semantics — The public RpcPromise<T> alias changed from Stub<T> & Promise<Stubify<T>> to mirror Result's arms. These are not structurally identical (e.g. for a primitive T, the new form adds Provider<T>), so it's a genuine change to the exported type, not a pure refactor. I judged it defensible/better since RpcPromise is documented as "the result of an RPC call," but flagged that the PR body should mention the exported shape shifts slightly.

  2. Cleanup (inline suggestion)Stubify is now an unused import in index.ts (only the old definition referenced it). Neither tsconfig enables noUnusedLocals, so it slipped through. Posted a suggestion to drop it.

Overall assessment: correct and a solid improvement, with one minor unused-import nit.

github run

github-actionsBot pushed a commit to Maximo-Guk/capnweb that referenced this pull request Aug 12, 2026
Co-authored-by: teamchong <teamchong@users.noreply.github.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Maximo-Guk
Maximo-Gukforce-pushed the shared-rpc-promise-alias branch from ef5c64b to cce0eb9CompareAugust 12, 2026 15:30
@dimitropoulos
dimitropoulosforce-pushed the shared-rpc-promise-alias branch from cce0eb9 to 27b5d05CompareAugust 12, 2026 15:50
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Maximo-Guk
Maximo-Gukforce-pushed the shared-rpc-promise-alias branch from 27b5d05 to 778dd8eCompareAugust 12, 2026 16:04
@dimitropoulos
dimitropoulos merged commit 5da3786 into cloudflare:mainAug 12, 2026
5 checks passed
Maximo-Guk added a commit to cloudflare/cloudflare-os that referenced this pull request Aug 12, 2026
The typescript catalog entry moves to 7.0.2; capnweb 0.11's shared
RpcPromise alias (cloudflare/capnweb#237) removed the depth errors that
blocked this. Consumers of the JS compiler API keep a JS-based compiler:
capnweb-validate's transform gets a pinned typescript 6.0.3 dependency
via .pnpmfile.cjs (its typescript peer would otherwise resolve to 7.x,
which ships no compiler API), and the configurator build script plus the
mcp-shared schema test import the typescript6 alias. typed-storage gains
the rootDir TS7 emit requires, workshop-backend drops an Env.BROWSER
optional override TS7 rejects (use sites read BrowserRun | undefined),
and three map/filter callbacks get explicit parameter types.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Maximo-Guk added a commit to cloudflare/cloudflare-os that referenced this pull request Aug 12, 2026
The typescript catalog entry moves to 7.0.2; capnweb 0.11's shared
RpcPromise alias (cloudflare/capnweb#237) removed the depth errors that
blocked this. Consumers of the JS compiler API keep a JS-based compiler:
capnweb-validate's transform gets a pinned typescript 6.0.3 dependency
via .pnpmfile.cjs (its typescript peer would otherwise resolve to 7.x,
which ships no compiler API), and the configurator build script plus the
mcp-shared schema test import the typescript6 alias. typed-storage gains
the rootDir TS7 emit requires, workshop-backend drops an Env.BROWSER
optional override TS7 rejects (use sites read BrowserRun | undefined),
and three map/filter callbacks get explicit parameter types.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Maximo-Guk added a commit to cloudflare/cloudflare-os that referenced this pull request Aug 12, 2026
The typescript catalog entry moves to 7.0.2; capnweb 0.11's shared
RpcPromise alias (cloudflare/capnweb#237) removed the depth errors that
blocked this. Consumers of the JS compiler API keep a JS-based compiler:
capnweb-validate's transform gets a pinned typescript 6.0.3 dependency
via .pnpmfile.cjs (its typescript peer would otherwise resolve to 7.x,
which ships no compiler API), and the configurator build script plus the
mcp-shared schema test import the typescript6 alias. typed-storage gains
the rootDir TS7 emit requires, workshop-backend drops an Env.BROWSER
optional override TS7 rejects (use sites read BrowserRun | undefined),
and three map/filter callbacks get explicit parameter types.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto 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

@Maximo-Guk@teamchong@dimitropoulos