Skip to content

feat: Support ArrayBuffer and Buffer Views serialization - #201

Merged
kentonv merged 5 commits into
cloudflare:mainfrom
ttmx:feat/bufferviews-serialization
Jul 16, 2026
Merged

feat: Support ArrayBuffer and Buffer Views serialization#201
kentonv merged 5 commits into
cloudflare:mainfrom
ttmx:feat/bufferviews-serialization

Conversation

@ttmx

@ttmxttmx commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

Added serialization support for ArrayBuffer and Buffer views, like Int8Array, Uint8ClampedArray, etc.

@github-actions

github-actionsBot commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

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

@ttmx
ttmxforce-pushed the feat/bufferviews-serialization branch from 66c4db3 to 4231ea8CompareJune 25, 2026 11:29
@changeset-bot

changeset-botBot commented Jun 25, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: f3ac57a

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

This PR includes changesets to release 1 package
NameType
capnwebMinor

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

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

@ttmx

ttmx commented Jun 25, 2026

Copy link
Copy Markdown
ContributorAuthor

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

github-actionsBot added a commit that referenced this pull request Jun 25, 2026
@ttmxttmx changed the title Support ArrayBuffer and Buffer Views serializationfeat: Support ArrayBuffer and Buffer Views serializationJun 25, 2026

@kentonvkentonv left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Design looks good to me. I'm overloaded and don't have time to review line-by-line, maybe @dimitropoulos or @teamchong can take it.

Comment threadprotocol.md Outdated
@pkg-pr-new

pkg-pr-newBot commented Jun 25, 2026

Copy link
Copy Markdown

Open in StackBlitz

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

commit: f3ac57a

Comment threadprotocol.md
Comment threadsrc/serialize.ts Outdated
Comment threadsrc/serialize.ts Outdated
@ndisidore

Copy link
Copy Markdown
Member

/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.

Reviewed the ArrayBuffer / typed-array serialization support. The design is solid and I'm glad to see the earlier review feedback addressed: the misalignment validation, little-endian wire order, and the minor version bump are all in place, and the test coverage is thorough (offset views, endianness, misalignment, unknown markers).

A few things worth considering below. None are blocking, but the "Uint8Array" marker robustness gap and the swapByteOrder missing default are worth a look.

Notes / questions:

  1. Incoming "Uint8Array" marker throws. The serializer intentionally emits the 2-element legacy form for Uint8Array, but a different or future implementation could legitimately send ["bytes", b64, "Uint8Array"]. That currently falls through to the default case and throws Unknown bytes type marker: Uint8Array. Since the protocol doc lists the marker set explicitly, it may be worth either (a) accepting "Uint8Array" (and "Buffer"?) as valid inbound markers, or (b) documenting in protocol.md that Uint8Array must always use the 2-element form. Deciding this now avoids a compatibility footgun later.

  2. The 12-case prototype switch in Devaluator duplicates the marker names already listed in core.ts and the deserialize switch. A single prototype→name map (or reusing one shared constant) would reduce the chance of these three lists drifting apart over time. Stylistic, but this is exactly the kind of triplicated list that tends to rot.

Comment threadsrc/serialize.ts
Comment threadsrc/serialize.ts Outdated
Comment threadsrc/serialize.ts Outdated
Comment threadprotocol.md
@ask-bonk

ask-bonkBot commented Jul 15, 2026

Copy link
Copy Markdown

Review submitted successfully. Here's a summary of what I found:

Review of PR #201: ArrayBuffer and Buffer Views serialization

The PR is well-executed. The prior reviewer feedback (from ndisidore and kentonv) has all been addressed:

  • Misalignment validation (byteLength % elementSize) — added
  • Little-endian wire order mandated and implemented
  • Version bump corrected to minor (not patch)
  • Explicit type list added to protocol.md

Non-blocking notes I posted:

  1. Inbound "Uint8Array" marker throws — the serializer only ever emits the 2-element legacy form for Uint8Array, so an incoming explicit "Uint8Array" marker (from another implementation) falls into the default case and throws. Worth either accepting it or explicitly documenting the rule in protocol.md.

  2. swapByteOrder has no default case — silently no-ops on an unexpected elementSize. Currently unreachable, but a default: throw would fail loudly on misuse. Posted a suggestion.

  3. Triplicated type lists — the prototype switch in Devaluator, TYPED_ARRAY_ELEMENT_SIZE, and the deserialize switch all enumerate overlapping subsets of the same type set; a shared table would prevent drift.

  4. Defensive .slice() copy — correct and necessary (guards against Node Buffer pooling); suggested a clarifying comment.

  5. protocol.md — spec is silent on unknown-marker behavior and the Uint8Array rule; documenting these would firm up the wire contract for other implementations.

No correctness bugs found in the happy path or the endianness handling; the tests are host-independent and cover the important edge cases.

github run

Comment threadsrc/serialize.ts
@kentonv

Copy link
Copy Markdown
Member

/bonk re-review please

@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.

Re-review. All the feedback from the previous rounds has been addressed cleanly:

  • Misalignment validation (byteLength % elementSize) — done, with a clear error message and test coverage.
  • Little-endian wire order — mandated in protocol.md and implemented via swapByteOrder; the endianness handling is host-independent and tested.
  • minor version bump — correct.
  • Explicit type list in protocol.md — added, including the unknown-marker throw behavior and the Uint8Array markerless rule that were called out last time.
  • swapByteOrder default — now throws RangeError on unsupported element sizes (the earlier suggestion).
  • Inbound explicit "Uint8Array" marker — now accepted (and tested), closing the compatibility footgun.
  • .slice() copy — documented as deliberate.

I ran tsc (no new errors in src/serialize.ts / src/core.ts) and a manual roundtrip of all 13 type markers, offset views, and the legacy/explicit Uint8Array forms — all correct.

Two small, non-blocking notes below. Nice work.

Comment threadsrc/serialize.ts
Comment threadsrc/core.ts
@ask-bonk

ask-bonkBot commented Jul 15, 2026

Copy link
Copy Markdown

Re-review submitted. Summary of my findings:

PR #201 re-review — ArrayBuffer / typed-array serialization

All prior feedback resolved. The author addressed every point from the earlier rounds (ndisidore, kenton, and the previous bonk review):

  • Misalignment validation (byteLength % elementSize) with clear errors + tests
  • Little-endian wire order mandated in protocol.md and implemented host-independently
  • minor version bump
  • Explicit supported-type list, unknown-marker behavior, and Uint8Array markerless rule documented in protocol.md
  • swapByteOrder now throws RangeError on unsupported element sizes
  • Inbound explicit "Uint8Array" marker now accepted (closes the compatibility footgun)
  • .slice() copy documented as deliberate

Verification I ran:tsc (no new errors in the changed source files — the only errors are pre-existing bun-types issues in bun.test.ts, unrelated), plus a manual roundtrip of all 13 markers, offset views, and both legacy/explicit Uint8Array forms — all correct.

Two non-blocking notes posted:

  1. The deserialize inner switch's default: marker satisfies never is compile-time-only; if hit at runtime it would fall through into case "error". Suggested adding a runtime throw.
  2. core.ts's typeForRpc case list is a fourth hand-maintained enumeration of the byte-container type set — a shared prototype constant would eliminate drift risk.

No correctness bugs found. The PR looks ready to merge modulo the maintainer's call on the two minor notes.

github run

github-actionsBot pushed a commit to ttmx/capnweb that referenced this pull request Jul 15, 2026
Co-authored-by: kentonv <kentonv@users.noreply.github.com>
@kentonv

Copy link
Copy Markdown
Member

ughh Bonk accidentally pushed a commit. It does that sometimes and we don't know why. @ttmx can you force-push remove bonk's commit? Then I think we can merge this, no other changes needed.

@ttmx
ttmxforce-pushed the feat/bufferviews-serialization branch from cce656c to f3ac57aCompareJuly 16, 2026 00:00
@kentonv
kentonv merged commit 7325f9d into cloudflare:mainJul 16, 2026
9 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Jul 16, 2026
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

@ttmx@ndisidore@kentonv
, '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" + '
feat: Support ArrayBuffer and Buffer Views serialization by ttmx · Pull Request #201 · cloudflare/capnweb · GitHub
Skip to content

feat: Support ArrayBuffer and Buffer Views serialization - #201

Merged
kentonv merged 5 commits into
cloudflare:mainfrom
ttmx:feat/bufferviews-serialization
Jul 16, 2026
Merged

feat: Support ArrayBuffer and Buffer Views serialization#201
kentonv merged 5 commits into
cloudflare:mainfrom
ttmx:feat/bufferviews-serialization

Conversation

@ttmx

@ttmxttmx commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

Added serialization support for ArrayBuffer and Buffer views, like Int8Array, Uint8ClampedArray, etc.

@github-actions

github-actionsBot commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

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

@ttmx
ttmxforce-pushed the feat/bufferviews-serialization branch from 66c4db3 to 4231ea8CompareJune 25, 2026 11:29
@changeset-bot

changeset-botBot commented Jun 25, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: f3ac57a

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

This PR includes changesets to release 1 package
NameType
capnwebMinor

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

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

@ttmx

ttmx commented Jun 25, 2026

Copy link
Copy Markdown
ContributorAuthor

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

github-actionsBot added a commit that referenced this pull request Jun 25, 2026
@ttmxttmx changed the title Support ArrayBuffer and Buffer Views serializationfeat: Support ArrayBuffer and Buffer Views serializationJun 25, 2026

@kentonvkentonv left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Design looks good to me. I'm overloaded and don't have time to review line-by-line, maybe @dimitropoulos or @teamchong can take it.

Comment threadprotocol.md Outdated
@pkg-pr-new

pkg-pr-newBot commented Jun 25, 2026

Copy link
Copy Markdown

Open in StackBlitz

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

commit: f3ac57a

Comment threadprotocol.md
Comment threadsrc/serialize.ts Outdated
Comment threadsrc/serialize.ts Outdated
@ndisidore

Copy link
Copy Markdown
Member

/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.

Reviewed the ArrayBuffer / typed-array serialization support. The design is solid and I'm glad to see the earlier review feedback addressed: the misalignment validation, little-endian wire order, and the minor version bump are all in place, and the test coverage is thorough (offset views, endianness, misalignment, unknown markers).

A few things worth considering below. None are blocking, but the "Uint8Array" marker robustness gap and the swapByteOrder missing default are worth a look.

Notes / questions:

  1. Incoming "Uint8Array" marker throws. The serializer intentionally emits the 2-element legacy form for Uint8Array, but a different or future implementation could legitimately send ["bytes", b64, "Uint8Array"]. That currently falls through to the default case and throws Unknown bytes type marker: Uint8Array. Since the protocol doc lists the marker set explicitly, it may be worth either (a) accepting "Uint8Array" (and "Buffer"?) as valid inbound markers, or (b) documenting in protocol.md that Uint8Array must always use the 2-element form. Deciding this now avoids a compatibility footgun later.

  2. The 12-case prototype switch in Devaluator duplicates the marker names already listed in core.ts and the deserialize switch. A single prototype→name map (or reusing one shared constant) would reduce the chance of these three lists drifting apart over time. Stylistic, but this is exactly the kind of triplicated list that tends to rot.

Comment threadsrc/serialize.ts
Comment threadsrc/serialize.ts Outdated
Comment threadsrc/serialize.ts Outdated
Comment threadprotocol.md
@ask-bonk

ask-bonkBot commented Jul 15, 2026

Copy link
Copy Markdown

Review submitted successfully. Here's a summary of what I found:

Review of PR #201: ArrayBuffer and Buffer Views serialization

The PR is well-executed. The prior reviewer feedback (from ndisidore and kentonv) has all been addressed:

  • Misalignment validation (byteLength % elementSize) — added
  • Little-endian wire order mandated and implemented
  • Version bump corrected to minor (not patch)
  • Explicit type list added to protocol.md

Non-blocking notes I posted:

  1. Inbound "Uint8Array" marker throws — the serializer only ever emits the 2-element legacy form for Uint8Array, so an incoming explicit "Uint8Array" marker (from another implementation) falls into the default case and throws. Worth either accepting it or explicitly documenting the rule in protocol.md.

  2. swapByteOrder has no default case — silently no-ops on an unexpected elementSize. Currently unreachable, but a default: throw would fail loudly on misuse. Posted a suggestion.

  3. Triplicated type lists — the prototype switch in Devaluator, TYPED_ARRAY_ELEMENT_SIZE, and the deserialize switch all enumerate overlapping subsets of the same type set; a shared table would prevent drift.

  4. Defensive .slice() copy — correct and necessary (guards against Node Buffer pooling); suggested a clarifying comment.

  5. protocol.md — spec is silent on unknown-marker behavior and the Uint8Array rule; documenting these would firm up the wire contract for other implementations.

No correctness bugs found in the happy path or the endianness handling; the tests are host-independent and cover the important edge cases.

github run

Comment threadsrc/serialize.ts
@kentonv

Copy link
Copy Markdown
Member

/bonk re-review please

@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.

Re-review. All the feedback from the previous rounds has been addressed cleanly:

  • Misalignment validation (byteLength % elementSize) — done, with a clear error message and test coverage.
  • Little-endian wire order — mandated in protocol.md and implemented via swapByteOrder; the endianness handling is host-independent and tested.
  • minor version bump — correct.
  • Explicit type list in protocol.md — added, including the unknown-marker throw behavior and the Uint8Array markerless rule that were called out last time.
  • swapByteOrder default — now throws RangeError on unsupported element sizes (the earlier suggestion).
  • Inbound explicit "Uint8Array" marker — now accepted (and tested), closing the compatibility footgun.
  • .slice() copy — documented as deliberate.

I ran tsc (no new errors in src/serialize.ts / src/core.ts) and a manual roundtrip of all 13 type markers, offset views, and the legacy/explicit Uint8Array forms — all correct.

Two small, non-blocking notes below. Nice work.

Comment threadsrc/serialize.ts
Comment threadsrc/core.ts
@ask-bonk

ask-bonkBot commented Jul 15, 2026

Copy link
Copy Markdown

Re-review submitted. Summary of my findings:

PR #201 re-review — ArrayBuffer / typed-array serialization

All prior feedback resolved. The author addressed every point from the earlier rounds (ndisidore, kenton, and the previous bonk review):

  • Misalignment validation (byteLength % elementSize) with clear errors + tests
  • Little-endian wire order mandated in protocol.md and implemented host-independently
  • minor version bump
  • Explicit supported-type list, unknown-marker behavior, and Uint8Array markerless rule documented in protocol.md
  • swapByteOrder now throws RangeError on unsupported element sizes
  • Inbound explicit "Uint8Array" marker now accepted (closes the compatibility footgun)
  • .slice() copy documented as deliberate

Verification I ran:tsc (no new errors in the changed source files — the only errors are pre-existing bun-types issues in bun.test.ts, unrelated), plus a manual roundtrip of all 13 markers, offset views, and both legacy/explicit Uint8Array forms — all correct.

Two non-blocking notes posted:

  1. The deserialize inner switch's default: marker satisfies never is compile-time-only; if hit at runtime it would fall through into case "error". Suggested adding a runtime throw.
  2. core.ts's typeForRpc case list is a fourth hand-maintained enumeration of the byte-container type set — a shared prototype constant would eliminate drift risk.

No correctness bugs found. The PR looks ready to merge modulo the maintainer's call on the two minor notes.

github run

github-actionsBot pushed a commit to ttmx/capnweb that referenced this pull request Jul 15, 2026
Co-authored-by: kentonv <kentonv@users.noreply.github.com>
@kentonv

Copy link
Copy Markdown
Member

ughh Bonk accidentally pushed a commit. It does that sometimes and we don't know why. @ttmx can you force-push remove bonk's commit? Then I think we can merge this, no other changes needed.

@ttmx
ttmxforce-pushed the feat/bufferviews-serialization branch from cce656c to f3ac57aCompareJuly 16, 2026 00:00
@kentonv
kentonv merged commit 7325f9d into cloudflare:mainJul 16, 2026
9 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Jul 16, 2026
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

@ttmx@ndisidore@kentonv
, '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('^' + ".*" + ' feat: Support ArrayBuffer and Buffer Views serialization by ttmx · Pull Request #201 · cloudflare/capnweb · GitHub
Skip to content

feat: Support ArrayBuffer and Buffer Views serialization - #201

Merged
kentonv merged 5 commits into
cloudflare:mainfrom
ttmx:feat/bufferviews-serialization
Jul 16, 2026
Merged

feat: Support ArrayBuffer and Buffer Views serialization#201
kentonv merged 5 commits into
cloudflare:mainfrom
ttmx:feat/bufferviews-serialization

Conversation

@ttmx

@ttmxttmx commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

Added serialization support for ArrayBuffer and Buffer views, like Int8Array, Uint8ClampedArray, etc.

@github-actions

github-actionsBot commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

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

@ttmx
ttmxforce-pushed the feat/bufferviews-serialization branch from 66c4db3 to 4231ea8CompareJune 25, 2026 11:29
@changeset-bot

changeset-botBot commented Jun 25, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: f3ac57a

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

This PR includes changesets to release 1 package
NameType
capnwebMinor

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

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

@ttmx

ttmx commented Jun 25, 2026

Copy link
Copy Markdown
ContributorAuthor

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

github-actionsBot added a commit that referenced this pull request Jun 25, 2026
@ttmxttmx changed the title Support ArrayBuffer and Buffer Views serializationfeat: Support ArrayBuffer and Buffer Views serializationJun 25, 2026

@kentonvkentonv left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Design looks good to me. I'm overloaded and don't have time to review line-by-line, maybe @dimitropoulos or @teamchong can take it.

Comment threadprotocol.md Outdated
@pkg-pr-new

pkg-pr-newBot commented Jun 25, 2026

Copy link
Copy Markdown

Open in StackBlitz

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

commit: f3ac57a

Comment threadprotocol.md
Comment threadsrc/serialize.ts Outdated
Comment threadsrc/serialize.ts Outdated
@ndisidore

Copy link
Copy Markdown
Member

/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.

Reviewed the ArrayBuffer / typed-array serialization support. The design is solid and I'm glad to see the earlier review feedback addressed: the misalignment validation, little-endian wire order, and the minor version bump are all in place, and the test coverage is thorough (offset views, endianness, misalignment, unknown markers).

A few things worth considering below. None are blocking, but the "Uint8Array" marker robustness gap and the swapByteOrder missing default are worth a look.

Notes / questions:

  1. Incoming "Uint8Array" marker throws. The serializer intentionally emits the 2-element legacy form for Uint8Array, but a different or future implementation could legitimately send ["bytes", b64, "Uint8Array"]. That currently falls through to the default case and throws Unknown bytes type marker: Uint8Array. Since the protocol doc lists the marker set explicitly, it may be worth either (a) accepting "Uint8Array" (and "Buffer"?) as valid inbound markers, or (b) documenting in protocol.md that Uint8Array must always use the 2-element form. Deciding this now avoids a compatibility footgun later.

  2. The 12-case prototype switch in Devaluator duplicates the marker names already listed in core.ts and the deserialize switch. A single prototype→name map (or reusing one shared constant) would reduce the chance of these three lists drifting apart over time. Stylistic, but this is exactly the kind of triplicated list that tends to rot.

Comment threadsrc/serialize.ts
Comment threadsrc/serialize.ts Outdated
Comment threadsrc/serialize.ts Outdated
Comment threadprotocol.md
@ask-bonk

ask-bonkBot commented Jul 15, 2026

Copy link
Copy Markdown

Review submitted successfully. Here's a summary of what I found:

Review of PR #201: ArrayBuffer and Buffer Views serialization

The PR is well-executed. The prior reviewer feedback (from ndisidore and kentonv) has all been addressed:

  • Misalignment validation (byteLength % elementSize) — added
  • Little-endian wire order mandated and implemented
  • Version bump corrected to minor (not patch)
  • Explicit type list added to protocol.md

Non-blocking notes I posted:

  1. Inbound "Uint8Array" marker throws — the serializer only ever emits the 2-element legacy form for Uint8Array, so an incoming explicit "Uint8Array" marker (from another implementation) falls into the default case and throws. Worth either accepting it or explicitly documenting the rule in protocol.md.

  2. swapByteOrder has no default case — silently no-ops on an unexpected elementSize. Currently unreachable, but a default: throw would fail loudly on misuse. Posted a suggestion.

  3. Triplicated type lists — the prototype switch in Devaluator, TYPED_ARRAY_ELEMENT_SIZE, and the deserialize switch all enumerate overlapping subsets of the same type set; a shared table would prevent drift.

  4. Defensive .slice() copy — correct and necessary (guards against Node Buffer pooling); suggested a clarifying comment.

  5. protocol.md — spec is silent on unknown-marker behavior and the Uint8Array rule; documenting these would firm up the wire contract for other implementations.

No correctness bugs found in the happy path or the endianness handling; the tests are host-independent and cover the important edge cases.

github run

Comment threadsrc/serialize.ts
@kentonv

Copy link
Copy Markdown
Member

/bonk re-review please

@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.

Re-review. All the feedback from the previous rounds has been addressed cleanly:

  • Misalignment validation (byteLength % elementSize) — done, with a clear error message and test coverage.
  • Little-endian wire order — mandated in protocol.md and implemented via swapByteOrder; the endianness handling is host-independent and tested.
  • minor version bump — correct.
  • Explicit type list in protocol.md — added, including the unknown-marker throw behavior and the Uint8Array markerless rule that were called out last time.
  • swapByteOrder default — now throws RangeError on unsupported element sizes (the earlier suggestion).
  • Inbound explicit "Uint8Array" marker — now accepted (and tested), closing the compatibility footgun.
  • .slice() copy — documented as deliberate.

I ran tsc (no new errors in src/serialize.ts / src/core.ts) and a manual roundtrip of all 13 type markers, offset views, and the legacy/explicit Uint8Array forms — all correct.

Two small, non-blocking notes below. Nice work.

Comment threadsrc/serialize.ts
Comment threadsrc/core.ts
@ask-bonk

ask-bonkBot commented Jul 15, 2026

Copy link
Copy Markdown

Re-review submitted. Summary of my findings:

PR #201 re-review — ArrayBuffer / typed-array serialization

All prior feedback resolved. The author addressed every point from the earlier rounds (ndisidore, kenton, and the previous bonk review):

  • Misalignment validation (byteLength % elementSize) with clear errors + tests
  • Little-endian wire order mandated in protocol.md and implemented host-independently
  • minor version bump
  • Explicit supported-type list, unknown-marker behavior, and Uint8Array markerless rule documented in protocol.md
  • swapByteOrder now throws RangeError on unsupported element sizes
  • Inbound explicit "Uint8Array" marker now accepted (closes the compatibility footgun)
  • .slice() copy documented as deliberate

Verification I ran:tsc (no new errors in the changed source files — the only errors are pre-existing bun-types issues in bun.test.ts, unrelated), plus a manual roundtrip of all 13 markers, offset views, and both legacy/explicit Uint8Array forms — all correct.

Two non-blocking notes posted:

  1. The deserialize inner switch's default: marker satisfies never is compile-time-only; if hit at runtime it would fall through into case "error". Suggested adding a runtime throw.
  2. core.ts's typeForRpc case list is a fourth hand-maintained enumeration of the byte-container type set — a shared prototype constant would eliminate drift risk.

No correctness bugs found. The PR looks ready to merge modulo the maintainer's call on the two minor notes.

github run

github-actionsBot pushed a commit to ttmx/capnweb that referenced this pull request Jul 15, 2026
Co-authored-by: kentonv <kentonv@users.noreply.github.com>
@kentonv

Copy link
Copy Markdown
Member

ughh Bonk accidentally pushed a commit. It does that sometimes and we don't know why. @ttmx can you force-push remove bonk's commit? Then I think we can merge this, no other changes needed.

@ttmx
ttmxforce-pushed the feat/bufferviews-serialization branch from cce656c to f3ac57aCompareJuly 16, 2026 00:00
@kentonv
kentonv merged commit 7325f9d into cloudflare:mainJul 16, 2026
9 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Jul 16, 2026
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

@ttmx@ndisidore@kentonv
, '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('^' + ".*" + ' feat: Support ArrayBuffer and Buffer Views serialization by ttmx · Pull Request #201 · cloudflare/capnweb · GitHub
Skip to content

feat: Support ArrayBuffer and Buffer Views serialization - #201

Merged
kentonv merged 5 commits into
cloudflare:mainfrom
ttmx:feat/bufferviews-serialization
Jul 16, 2026
Merged

feat: Support ArrayBuffer and Buffer Views serialization#201
kentonv merged 5 commits into
cloudflare:mainfrom
ttmx:feat/bufferviews-serialization

Conversation

@ttmx

@ttmxttmx commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

Added serialization support for ArrayBuffer and Buffer views, like Int8Array, Uint8ClampedArray, etc.

@github-actions

github-actionsBot commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

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

@ttmx
ttmxforce-pushed the feat/bufferviews-serialization branch from 66c4db3 to 4231ea8CompareJune 25, 2026 11:29
@changeset-bot

changeset-botBot commented Jun 25, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: f3ac57a

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

This PR includes changesets to release 1 package
NameType
capnwebMinor

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

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

@ttmx

ttmx commented Jun 25, 2026

Copy link
Copy Markdown
ContributorAuthor

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

github-actionsBot added a commit that referenced this pull request Jun 25, 2026
@ttmxttmx changed the title Support ArrayBuffer and Buffer Views serializationfeat: Support ArrayBuffer and Buffer Views serializationJun 25, 2026

@kentonvkentonv left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Design looks good to me. I'm overloaded and don't have time to review line-by-line, maybe @dimitropoulos or @teamchong can take it.

Comment threadprotocol.md Outdated
@pkg-pr-new

pkg-pr-newBot commented Jun 25, 2026

Copy link
Copy Markdown

Open in StackBlitz

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

commit: f3ac57a

Comment threadprotocol.md
Comment threadsrc/serialize.ts Outdated
Comment threadsrc/serialize.ts Outdated
@ndisidore

Copy link
Copy Markdown
Member

/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.

Reviewed the ArrayBuffer / typed-array serialization support. The design is solid and I'm glad to see the earlier review feedback addressed: the misalignment validation, little-endian wire order, and the minor version bump are all in place, and the test coverage is thorough (offset views, endianness, misalignment, unknown markers).

A few things worth considering below. None are blocking, but the "Uint8Array" marker robustness gap and the swapByteOrder missing default are worth a look.

Notes / questions:

  1. Incoming "Uint8Array" marker throws. The serializer intentionally emits the 2-element legacy form for Uint8Array, but a different or future implementation could legitimately send ["bytes", b64, "Uint8Array"]. That currently falls through to the default case and throws Unknown bytes type marker: Uint8Array. Since the protocol doc lists the marker set explicitly, it may be worth either (a) accepting "Uint8Array" (and "Buffer"?) as valid inbound markers, or (b) documenting in protocol.md that Uint8Array must always use the 2-element form. Deciding this now avoids a compatibility footgun later.

  2. The 12-case prototype switch in Devaluator duplicates the marker names already listed in core.ts and the deserialize switch. A single prototype→name map (or reusing one shared constant) would reduce the chance of these three lists drifting apart over time. Stylistic, but this is exactly the kind of triplicated list that tends to rot.

Comment threadsrc/serialize.ts
Comment threadsrc/serialize.ts Outdated
Comment threadsrc/serialize.ts Outdated
Comment threadprotocol.md
@ask-bonk

ask-bonkBot commented Jul 15, 2026

Copy link
Copy Markdown

Review submitted successfully. Here's a summary of what I found:

Review of PR #201: ArrayBuffer and Buffer Views serialization

The PR is well-executed. The prior reviewer feedback (from ndisidore and kentonv) has all been addressed:

  • Misalignment validation (byteLength % elementSize) — added
  • Little-endian wire order mandated and implemented
  • Version bump corrected to minor (not patch)
  • Explicit type list added to protocol.md

Non-blocking notes I posted:

  1. Inbound "Uint8Array" marker throws — the serializer only ever emits the 2-element legacy form for Uint8Array, so an incoming explicit "Uint8Array" marker (from another implementation) falls into the default case and throws. Worth either accepting it or explicitly documenting the rule in protocol.md.

  2. swapByteOrder has no default case — silently no-ops on an unexpected elementSize. Currently unreachable, but a default: throw would fail loudly on misuse. Posted a suggestion.

  3. Triplicated type lists — the prototype switch in Devaluator, TYPED_ARRAY_ELEMENT_SIZE, and the deserialize switch all enumerate overlapping subsets of the same type set; a shared table would prevent drift.

  4. Defensive .slice() copy — correct and necessary (guards against Node Buffer pooling); suggested a clarifying comment.

  5. protocol.md — spec is silent on unknown-marker behavior and the Uint8Array rule; documenting these would firm up the wire contract for other implementations.

No correctness bugs found in the happy path or the endianness handling; the tests are host-independent and cover the important edge cases.

github run

Comment threadsrc/serialize.ts
@kentonv

Copy link
Copy Markdown
Member

/bonk re-review please

@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.

Re-review. All the feedback from the previous rounds has been addressed cleanly:

  • Misalignment validation (byteLength % elementSize) — done, with a clear error message and test coverage.
  • Little-endian wire order — mandated in protocol.md and implemented via swapByteOrder; the endianness handling is host-independent and tested.
  • minor version bump — correct.
  • Explicit type list in protocol.md — added, including the unknown-marker throw behavior and the Uint8Array markerless rule that were called out last time.
  • swapByteOrder default — now throws RangeError on unsupported element sizes (the earlier suggestion).
  • Inbound explicit "Uint8Array" marker — now accepted (and tested), closing the compatibility footgun.
  • .slice() copy — documented as deliberate.

I ran tsc (no new errors in src/serialize.ts / src/core.ts) and a manual roundtrip of all 13 type markers, offset views, and the legacy/explicit Uint8Array forms — all correct.

Two small, non-blocking notes below. Nice work.

Comment threadsrc/serialize.ts
Comment threadsrc/core.ts
@ask-bonk

ask-bonkBot commented Jul 15, 2026

Copy link
Copy Markdown

Re-review submitted. Summary of my findings:

PR #201 re-review — ArrayBuffer / typed-array serialization

All prior feedback resolved. The author addressed every point from the earlier rounds (ndisidore, kenton, and the previous bonk review):

  • Misalignment validation (byteLength % elementSize) with clear errors + tests
  • Little-endian wire order mandated in protocol.md and implemented host-independently
  • minor version bump
  • Explicit supported-type list, unknown-marker behavior, and Uint8Array markerless rule documented in protocol.md
  • swapByteOrder now throws RangeError on unsupported element sizes
  • Inbound explicit "Uint8Array" marker now accepted (closes the compatibility footgun)
  • .slice() copy documented as deliberate

Verification I ran:tsc (no new errors in the changed source files — the only errors are pre-existing bun-types issues in bun.test.ts, unrelated), plus a manual roundtrip of all 13 markers, offset views, and both legacy/explicit Uint8Array forms — all correct.

Two non-blocking notes posted:

  1. The deserialize inner switch's default: marker satisfies never is compile-time-only; if hit at runtime it would fall through into case "error". Suggested adding a runtime throw.
  2. core.ts's typeForRpc case list is a fourth hand-maintained enumeration of the byte-container type set — a shared prototype constant would eliminate drift risk.

No correctness bugs found. The PR looks ready to merge modulo the maintainer's call on the two minor notes.

github run

github-actionsBot pushed a commit to ttmx/capnweb that referenced this pull request Jul 15, 2026
Co-authored-by: kentonv <kentonv@users.noreply.github.com>
@kentonv

Copy link
Copy Markdown
Member

ughh Bonk accidentally pushed a commit. It does that sometimes and we don't know why. @ttmx can you force-push remove bonk's commit? Then I think we can merge this, no other changes needed.

@ttmx
ttmxforce-pushed the feat/bufferviews-serialization branch from cce656c to f3ac57aCompareJuly 16, 2026 00:00
@kentonv
kentonv merged commit 7325f9d into cloudflare:mainJul 16, 2026
9 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Jul 16, 2026
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

@ttmx@ndisidore@kentonv
, '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" + ' feat: Support ArrayBuffer and Buffer Views serialization by ttmx · Pull Request #201 · cloudflare/capnweb · GitHub
Skip to content

feat: Support ArrayBuffer and Buffer Views serialization - #201

Merged
kentonv merged 5 commits into
cloudflare:mainfrom
ttmx:feat/bufferviews-serialization
Jul 16, 2026
Merged

feat: Support ArrayBuffer and Buffer Views serialization#201
kentonv merged 5 commits into
cloudflare:mainfrom
ttmx:feat/bufferviews-serialization

Conversation

@ttmx

@ttmxttmx commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

Added serialization support for ArrayBuffer and Buffer views, like Int8Array, Uint8ClampedArray, etc.

@github-actions

github-actionsBot commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

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

@ttmx
ttmxforce-pushed the feat/bufferviews-serialization branch from 66c4db3 to 4231ea8CompareJune 25, 2026 11:29
@changeset-bot

changeset-botBot commented Jun 25, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: f3ac57a

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

This PR includes changesets to release 1 package
NameType
capnwebMinor

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

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

@ttmx

ttmx commented Jun 25, 2026

Copy link
Copy Markdown
ContributorAuthor

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

github-actionsBot added a commit that referenced this pull request Jun 25, 2026
@ttmxttmx changed the title Support ArrayBuffer and Buffer Views serializationfeat: Support ArrayBuffer and Buffer Views serializationJun 25, 2026

@kentonvkentonv left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Design looks good to me. I'm overloaded and don't have time to review line-by-line, maybe @dimitropoulos or @teamchong can take it.

Comment threadprotocol.md Outdated
@pkg-pr-new

pkg-pr-newBot commented Jun 25, 2026

Copy link
Copy Markdown

Open in StackBlitz

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

commit: f3ac57a

Comment threadprotocol.md
Comment threadsrc/serialize.ts Outdated
Comment threadsrc/serialize.ts Outdated
@ndisidore

Copy link
Copy Markdown
Member

/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.

Reviewed the ArrayBuffer / typed-array serialization support. The design is solid and I'm glad to see the earlier review feedback addressed: the misalignment validation, little-endian wire order, and the minor version bump are all in place, and the test coverage is thorough (offset views, endianness, misalignment, unknown markers).

A few things worth considering below. None are blocking, but the "Uint8Array" marker robustness gap and the swapByteOrder missing default are worth a look.

Notes / questions:

  1. Incoming "Uint8Array" marker throws. The serializer intentionally emits the 2-element legacy form for Uint8Array, but a different or future implementation could legitimately send ["bytes", b64, "Uint8Array"]. That currently falls through to the default case and throws Unknown bytes type marker: Uint8Array. Since the protocol doc lists the marker set explicitly, it may be worth either (a) accepting "Uint8Array" (and "Buffer"?) as valid inbound markers, or (b) documenting in protocol.md that Uint8Array must always use the 2-element form. Deciding this now avoids a compatibility footgun later.

  2. The 12-case prototype switch in Devaluator duplicates the marker names already listed in core.ts and the deserialize switch. A single prototype→name map (or reusing one shared constant) would reduce the chance of these three lists drifting apart over time. Stylistic, but this is exactly the kind of triplicated list that tends to rot.

Comment threadsrc/serialize.ts
Comment threadsrc/serialize.ts Outdated
Comment threadsrc/serialize.ts Outdated
Comment threadprotocol.md
@ask-bonk

ask-bonkBot commented Jul 15, 2026

Copy link
Copy Markdown

Review submitted successfully. Here's a summary of what I found:

Review of PR #201: ArrayBuffer and Buffer Views serialization

The PR is well-executed. The prior reviewer feedback (from ndisidore and kentonv) has all been addressed:

  • Misalignment validation (byteLength % elementSize) — added
  • Little-endian wire order mandated and implemented
  • Version bump corrected to minor (not patch)
  • Explicit type list added to protocol.md

Non-blocking notes I posted:

  1. Inbound "Uint8Array" marker throws — the serializer only ever emits the 2-element legacy form for Uint8Array, so an incoming explicit "Uint8Array" marker (from another implementation) falls into the default case and throws. Worth either accepting it or explicitly documenting the rule in protocol.md.

  2. swapByteOrder has no default case — silently no-ops on an unexpected elementSize. Currently unreachable, but a default: throw would fail loudly on misuse. Posted a suggestion.

  3. Triplicated type lists — the prototype switch in Devaluator, TYPED_ARRAY_ELEMENT_SIZE, and the deserialize switch all enumerate overlapping subsets of the same type set; a shared table would prevent drift.

  4. Defensive .slice() copy — correct and necessary (guards against Node Buffer pooling); suggested a clarifying comment.

  5. protocol.md — spec is silent on unknown-marker behavior and the Uint8Array rule; documenting these would firm up the wire contract for other implementations.

No correctness bugs found in the happy path or the endianness handling; the tests are host-independent and cover the important edge cases.

github run

Comment threadsrc/serialize.ts
@kentonv

Copy link
Copy Markdown
Member

/bonk re-review please

@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.

Re-review. All the feedback from the previous rounds has been addressed cleanly:

  • Misalignment validation (byteLength % elementSize) — done, with a clear error message and test coverage.
  • Little-endian wire order — mandated in protocol.md and implemented via swapByteOrder; the endianness handling is host-independent and tested.
  • minor version bump — correct.
  • Explicit type list in protocol.md — added, including the unknown-marker throw behavior and the Uint8Array markerless rule that were called out last time.
  • swapByteOrder default — now throws RangeError on unsupported element sizes (the earlier suggestion).
  • Inbound explicit "Uint8Array" marker — now accepted (and tested), closing the compatibility footgun.
  • .slice() copy — documented as deliberate.

I ran tsc (no new errors in src/serialize.ts / src/core.ts) and a manual roundtrip of all 13 type markers, offset views, and the legacy/explicit Uint8Array forms — all correct.

Two small, non-blocking notes below. Nice work.

Comment threadsrc/serialize.ts
Comment threadsrc/core.ts
@ask-bonk

ask-bonkBot commented Jul 15, 2026

Copy link
Copy Markdown

Re-review submitted. Summary of my findings:

PR #201 re-review — ArrayBuffer / typed-array serialization

All prior feedback resolved. The author addressed every point from the earlier rounds (ndisidore, kenton, and the previous bonk review):

  • Misalignment validation (byteLength % elementSize) with clear errors + tests
  • Little-endian wire order mandated in protocol.md and implemented host-independently
  • minor version bump
  • Explicit supported-type list, unknown-marker behavior, and Uint8Array markerless rule documented in protocol.md
  • swapByteOrder now throws RangeError on unsupported element sizes
  • Inbound explicit "Uint8Array" marker now accepted (closes the compatibility footgun)
  • .slice() copy documented as deliberate

Verification I ran:tsc (no new errors in the changed source files — the only errors are pre-existing bun-types issues in bun.test.ts, unrelated), plus a manual roundtrip of all 13 markers, offset views, and both legacy/explicit Uint8Array forms — all correct.

Two non-blocking notes posted:

  1. The deserialize inner switch's default: marker satisfies never is compile-time-only; if hit at runtime it would fall through into case "error". Suggested adding a runtime throw.
  2. core.ts's typeForRpc case list is a fourth hand-maintained enumeration of the byte-container type set — a shared prototype constant would eliminate drift risk.

No correctness bugs found. The PR looks ready to merge modulo the maintainer's call on the two minor notes.

github run

github-actionsBot pushed a commit to ttmx/capnweb that referenced this pull request Jul 15, 2026
Co-authored-by: kentonv <kentonv@users.noreply.github.com>
@kentonv

Copy link
Copy Markdown
Member

ughh Bonk accidentally pushed a commit. It does that sometimes and we don't know why. @ttmx can you force-push remove bonk's commit? Then I think we can merge this, no other changes needed.

@ttmx
ttmxforce-pushed the feat/bufferviews-serialization branch from cce656c to f3ac57aCompareJuly 16, 2026 00:00
@kentonv
kentonv merged commit 7325f9d into cloudflare:mainJul 16, 2026
9 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Jul 16, 2026
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

@ttmx@ndisidore@kentonv
, '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('^' + ".*" + ' feat: Support ArrayBuffer and Buffer Views serialization by ttmx · Pull Request #201 · cloudflare/capnweb · GitHub
Skip to content

feat: Support ArrayBuffer and Buffer Views serialization - #201

Merged
kentonv merged 5 commits into
cloudflare:mainfrom
ttmx:feat/bufferviews-serialization
Jul 16, 2026
Merged

feat: Support ArrayBuffer and Buffer Views serialization#201
kentonv merged 5 commits into
cloudflare:mainfrom
ttmx:feat/bufferviews-serialization

Conversation

@ttmx

@ttmxttmx commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

Added serialization support for ArrayBuffer and Buffer views, like Int8Array, Uint8ClampedArray, etc.

@github-actions

github-actionsBot commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

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

@ttmx
ttmxforce-pushed the feat/bufferviews-serialization branch from 66c4db3 to 4231ea8CompareJune 25, 2026 11:29
@changeset-bot

changeset-botBot commented Jun 25, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: f3ac57a

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

This PR includes changesets to release 1 package
NameType
capnwebMinor

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

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

@ttmx

ttmx commented Jun 25, 2026

Copy link
Copy Markdown
ContributorAuthor

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

github-actionsBot added a commit that referenced this pull request Jun 25, 2026
@ttmxttmx changed the title Support ArrayBuffer and Buffer Views serializationfeat: Support ArrayBuffer and Buffer Views serializationJun 25, 2026

@kentonvkentonv left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Design looks good to me. I'm overloaded and don't have time to review line-by-line, maybe @dimitropoulos or @teamchong can take it.

Comment threadprotocol.md Outdated
@pkg-pr-new

pkg-pr-newBot commented Jun 25, 2026

Copy link
Copy Markdown

Open in StackBlitz

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

commit: f3ac57a

Comment threadprotocol.md
Comment threadsrc/serialize.ts Outdated
Comment threadsrc/serialize.ts Outdated
@ndisidore

Copy link
Copy Markdown
Member

/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.

Reviewed the ArrayBuffer / typed-array serialization support. The design is solid and I'm glad to see the earlier review feedback addressed: the misalignment validation, little-endian wire order, and the minor version bump are all in place, and the test coverage is thorough (offset views, endianness, misalignment, unknown markers).

A few things worth considering below. None are blocking, but the "Uint8Array" marker robustness gap and the swapByteOrder missing default are worth a look.

Notes / questions:

  1. Incoming "Uint8Array" marker throws. The serializer intentionally emits the 2-element legacy form for Uint8Array, but a different or future implementation could legitimately send ["bytes", b64, "Uint8Array"]. That currently falls through to the default case and throws Unknown bytes type marker: Uint8Array. Since the protocol doc lists the marker set explicitly, it may be worth either (a) accepting "Uint8Array" (and "Buffer"?) as valid inbound markers, or (b) documenting in protocol.md that Uint8Array must always use the 2-element form. Deciding this now avoids a compatibility footgun later.

  2. The 12-case prototype switch in Devaluator duplicates the marker names already listed in core.ts and the deserialize switch. A single prototype→name map (or reusing one shared constant) would reduce the chance of these three lists drifting apart over time. Stylistic, but this is exactly the kind of triplicated list that tends to rot.

Comment threadsrc/serialize.ts
Comment threadsrc/serialize.ts Outdated
Comment threadsrc/serialize.ts Outdated
Comment threadprotocol.md
@ask-bonk

ask-bonkBot commented Jul 15, 2026

Copy link
Copy Markdown

Review submitted successfully. Here's a summary of what I found:

Review of PR #201: ArrayBuffer and Buffer Views serialization

The PR is well-executed. The prior reviewer feedback (from ndisidore and kentonv) has all been addressed:

  • Misalignment validation (byteLength % elementSize) — added
  • Little-endian wire order mandated and implemented
  • Version bump corrected to minor (not patch)
  • Explicit type list added to protocol.md

Non-blocking notes I posted:

  1. Inbound "Uint8Array" marker throws — the serializer only ever emits the 2-element legacy form for Uint8Array, so an incoming explicit "Uint8Array" marker (from another implementation) falls into the default case and throws. Worth either accepting it or explicitly documenting the rule in protocol.md.

  2. swapByteOrder has no default case — silently no-ops on an unexpected elementSize. Currently unreachable, but a default: throw would fail loudly on misuse. Posted a suggestion.

  3. Triplicated type lists — the prototype switch in Devaluator, TYPED_ARRAY_ELEMENT_SIZE, and the deserialize switch all enumerate overlapping subsets of the same type set; a shared table would prevent drift.

  4. Defensive .slice() copy — correct and necessary (guards against Node Buffer pooling); suggested a clarifying comment.

  5. protocol.md — spec is silent on unknown-marker behavior and the Uint8Array rule; documenting these would firm up the wire contract for other implementations.

No correctness bugs found in the happy path or the endianness handling; the tests are host-independent and cover the important edge cases.

github run

Comment threadsrc/serialize.ts
@kentonv

Copy link
Copy Markdown
Member

/bonk re-review please

@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.

Re-review. All the feedback from the previous rounds has been addressed cleanly:

  • Misalignment validation (byteLength % elementSize) — done, with a clear error message and test coverage.
  • Little-endian wire order — mandated in protocol.md and implemented via swapByteOrder; the endianness handling is host-independent and tested.
  • minor version bump — correct.
  • Explicit type list in protocol.md — added, including the unknown-marker throw behavior and the Uint8Array markerless rule that were called out last time.
  • swapByteOrder default — now throws RangeError on unsupported element sizes (the earlier suggestion).
  • Inbound explicit "Uint8Array" marker — now accepted (and tested), closing the compatibility footgun.
  • .slice() copy — documented as deliberate.

I ran tsc (no new errors in src/serialize.ts / src/core.ts) and a manual roundtrip of all 13 type markers, offset views, and the legacy/explicit Uint8Array forms — all correct.

Two small, non-blocking notes below. Nice work.

Comment threadsrc/serialize.ts
Comment threadsrc/core.ts
@ask-bonk

ask-bonkBot commented Jul 15, 2026

Copy link
Copy Markdown

Re-review submitted. Summary of my findings:

PR #201 re-review — ArrayBuffer / typed-array serialization

All prior feedback resolved. The author addressed every point from the earlier rounds (ndisidore, kenton, and the previous bonk review):

  • Misalignment validation (byteLength % elementSize) with clear errors + tests
  • Little-endian wire order mandated in protocol.md and implemented host-independently
  • minor version bump
  • Explicit supported-type list, unknown-marker behavior, and Uint8Array markerless rule documented in protocol.md
  • swapByteOrder now throws RangeError on unsupported element sizes
  • Inbound explicit "Uint8Array" marker now accepted (closes the compatibility footgun)
  • .slice() copy documented as deliberate

Verification I ran:tsc (no new errors in the changed source files — the only errors are pre-existing bun-types issues in bun.test.ts, unrelated), plus a manual roundtrip of all 13 markers, offset views, and both legacy/explicit Uint8Array forms — all correct.

Two non-blocking notes posted:

  1. The deserialize inner switch's default: marker satisfies never is compile-time-only; if hit at runtime it would fall through into case "error". Suggested adding a runtime throw.
  2. core.ts's typeForRpc case list is a fourth hand-maintained enumeration of the byte-container type set — a shared prototype constant would eliminate drift risk.

No correctness bugs found. The PR looks ready to merge modulo the maintainer's call on the two minor notes.

github run

github-actionsBot pushed a commit to ttmx/capnweb that referenced this pull request Jul 15, 2026
Co-authored-by: kentonv <kentonv@users.noreply.github.com>
@kentonv

Copy link
Copy Markdown
Member

ughh Bonk accidentally pushed a commit. It does that sometimes and we don't know why. @ttmx can you force-push remove bonk's commit? Then I think we can merge this, no other changes needed.

@ttmx
ttmxforce-pushed the feat/bufferviews-serialization branch from cce656c to f3ac57aCompareJuly 16, 2026 00:00
@kentonv
kentonv merged commit 7325f9d into cloudflare:mainJul 16, 2026
9 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Jul 16, 2026
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

@ttmx@ndisidore@kentonv
, '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('^' + ".*" + ' feat: Support ArrayBuffer and Buffer Views serialization by ttmx · Pull Request #201 · cloudflare/capnweb · GitHub
Skip to content

feat: Support ArrayBuffer and Buffer Views serialization - #201

Merged
kentonv merged 5 commits into
cloudflare:mainfrom
ttmx:feat/bufferviews-serialization
Jul 16, 2026
Merged

feat: Support ArrayBuffer and Buffer Views serialization#201
kentonv merged 5 commits into
cloudflare:mainfrom
ttmx:feat/bufferviews-serialization

Conversation

@ttmx

@ttmxttmx commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

Added serialization support for ArrayBuffer and Buffer views, like Int8Array, Uint8ClampedArray, etc.

@github-actions

github-actionsBot commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

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

@ttmx
ttmxforce-pushed the feat/bufferviews-serialization branch from 66c4db3 to 4231ea8CompareJune 25, 2026 11:29
@changeset-bot

changeset-botBot commented Jun 25, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: f3ac57a

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

This PR includes changesets to release 1 package
NameType
capnwebMinor

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

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

@ttmx

ttmx commented Jun 25, 2026

Copy link
Copy Markdown
ContributorAuthor

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

github-actionsBot added a commit that referenced this pull request Jun 25, 2026
@ttmxttmx changed the title Support ArrayBuffer and Buffer Views serializationfeat: Support ArrayBuffer and Buffer Views serializationJun 25, 2026

@kentonvkentonv left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Design looks good to me. I'm overloaded and don't have time to review line-by-line, maybe @dimitropoulos or @teamchong can take it.

Comment threadprotocol.md Outdated
@pkg-pr-new

pkg-pr-newBot commented Jun 25, 2026

Copy link
Copy Markdown

Open in StackBlitz

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

commit: f3ac57a

Comment threadprotocol.md
Comment threadsrc/serialize.ts Outdated
Comment threadsrc/serialize.ts Outdated
@ndisidore

Copy link
Copy Markdown
Member

/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.

Reviewed the ArrayBuffer / typed-array serialization support. The design is solid and I'm glad to see the earlier review feedback addressed: the misalignment validation, little-endian wire order, and the minor version bump are all in place, and the test coverage is thorough (offset views, endianness, misalignment, unknown markers).

A few things worth considering below. None are blocking, but the "Uint8Array" marker robustness gap and the swapByteOrder missing default are worth a look.

Notes / questions:

  1. Incoming "Uint8Array" marker throws. The serializer intentionally emits the 2-element legacy form for Uint8Array, but a different or future implementation could legitimately send ["bytes", b64, "Uint8Array"]. That currently falls through to the default case and throws Unknown bytes type marker: Uint8Array. Since the protocol doc lists the marker set explicitly, it may be worth either (a) accepting "Uint8Array" (and "Buffer"?) as valid inbound markers, or (b) documenting in protocol.md that Uint8Array must always use the 2-element form. Deciding this now avoids a compatibility footgun later.

  2. The 12-case prototype switch in Devaluator duplicates the marker names already listed in core.ts and the deserialize switch. A single prototype→name map (or reusing one shared constant) would reduce the chance of these three lists drifting apart over time. Stylistic, but this is exactly the kind of triplicated list that tends to rot.

Comment threadsrc/serialize.ts
Comment threadsrc/serialize.ts Outdated
Comment threadsrc/serialize.ts Outdated
Comment threadprotocol.md
@ask-bonk

ask-bonkBot commented Jul 15, 2026

Copy link
Copy Markdown

Review submitted successfully. Here's a summary of what I found:

Review of PR #201: ArrayBuffer and Buffer Views serialization

The PR is well-executed. The prior reviewer feedback (from ndisidore and kentonv) has all been addressed:

  • Misalignment validation (byteLength % elementSize) — added
  • Little-endian wire order mandated and implemented
  • Version bump corrected to minor (not patch)
  • Explicit type list added to protocol.md

Non-blocking notes I posted:

  1. Inbound "Uint8Array" marker throws — the serializer only ever emits the 2-element legacy form for Uint8Array, so an incoming explicit "Uint8Array" marker (from another implementation) falls into the default case and throws. Worth either accepting it or explicitly documenting the rule in protocol.md.

  2. swapByteOrder has no default case — silently no-ops on an unexpected elementSize. Currently unreachable, but a default: throw would fail loudly on misuse. Posted a suggestion.

  3. Triplicated type lists — the prototype switch in Devaluator, TYPED_ARRAY_ELEMENT_SIZE, and the deserialize switch all enumerate overlapping subsets of the same type set; a shared table would prevent drift.

  4. Defensive .slice() copy — correct and necessary (guards against Node Buffer pooling); suggested a clarifying comment.

  5. protocol.md — spec is silent on unknown-marker behavior and the Uint8Array rule; documenting these would firm up the wire contract for other implementations.

No correctness bugs found in the happy path or the endianness handling; the tests are host-independent and cover the important edge cases.

github run

Comment threadsrc/serialize.ts
@kentonv

Copy link
Copy Markdown
Member

/bonk re-review please

@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.

Re-review. All the feedback from the previous rounds has been addressed cleanly:

  • Misalignment validation (byteLength % elementSize) — done, with a clear error message and test coverage.
  • Little-endian wire order — mandated in protocol.md and implemented via swapByteOrder; the endianness handling is host-independent and tested.
  • minor version bump — correct.
  • Explicit type list in protocol.md — added, including the unknown-marker throw behavior and the Uint8Array markerless rule that were called out last time.
  • swapByteOrder default — now throws RangeError on unsupported element sizes (the earlier suggestion).
  • Inbound explicit "Uint8Array" marker — now accepted (and tested), closing the compatibility footgun.
  • .slice() copy — documented as deliberate.

I ran tsc (no new errors in src/serialize.ts / src/core.ts) and a manual roundtrip of all 13 type markers, offset views, and the legacy/explicit Uint8Array forms — all correct.

Two small, non-blocking notes below. Nice work.

Comment threadsrc/serialize.ts
Comment threadsrc/core.ts
@ask-bonk

ask-bonkBot commented Jul 15, 2026

Copy link
Copy Markdown

Re-review submitted. Summary of my findings:

PR #201 re-review — ArrayBuffer / typed-array serialization

All prior feedback resolved. The author addressed every point from the earlier rounds (ndisidore, kenton, and the previous bonk review):

  • Misalignment validation (byteLength % elementSize) with clear errors + tests
  • Little-endian wire order mandated in protocol.md and implemented host-independently
  • minor version bump
  • Explicit supported-type list, unknown-marker behavior, and Uint8Array markerless rule documented in protocol.md
  • swapByteOrder now throws RangeError on unsupported element sizes
  • Inbound explicit "Uint8Array" marker now accepted (closes the compatibility footgun)
  • .slice() copy documented as deliberate

Verification I ran:tsc (no new errors in the changed source files — the only errors are pre-existing bun-types issues in bun.test.ts, unrelated), plus a manual roundtrip of all 13 markers, offset views, and both legacy/explicit Uint8Array forms — all correct.

Two non-blocking notes posted:

  1. The deserialize inner switch's default: marker satisfies never is compile-time-only; if hit at runtime it would fall through into case "error". Suggested adding a runtime throw.
  2. core.ts's typeForRpc case list is a fourth hand-maintained enumeration of the byte-container type set — a shared prototype constant would eliminate drift risk.

No correctness bugs found. The PR looks ready to merge modulo the maintainer's call on the two minor notes.

github run

github-actionsBot pushed a commit to ttmx/capnweb that referenced this pull request Jul 15, 2026
Co-authored-by: kentonv <kentonv@users.noreply.github.com>
@kentonv

Copy link
Copy Markdown
Member

ughh Bonk accidentally pushed a commit. It does that sometimes and we don't know why. @ttmx can you force-push remove bonk's commit? Then I think we can merge this, no other changes needed.

@ttmx
ttmxforce-pushed the feat/bufferviews-serialization branch from cce656c to f3ac57aCompareJuly 16, 2026 00:00
@kentonv
kentonv merged commit 7325f9d into cloudflare:mainJul 16, 2026
9 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Jul 16, 2026
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

@ttmx@ndisidore@kentonv
, '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); } })(); })(); feat: Support ArrayBuffer and Buffer Views serialization by ttmx · Pull Request #201 · cloudflare/capnweb · GitHub
Skip to content

feat: Support ArrayBuffer and Buffer Views serialization - #201

Merged
kentonv merged 5 commits into
cloudflare:mainfrom
ttmx:feat/bufferviews-serialization
Jul 16, 2026
Merged

feat: Support ArrayBuffer and Buffer Views serialization#201
kentonv merged 5 commits into
cloudflare:mainfrom
ttmx:feat/bufferviews-serialization

Conversation

@ttmx

@ttmxttmx commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

Added serialization support for ArrayBuffer and Buffer views, like Int8Array, Uint8ClampedArray, etc.

@github-actions

github-actionsBot commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

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

@ttmx
ttmxforce-pushed the feat/bufferviews-serialization branch from 66c4db3 to 4231ea8CompareJune 25, 2026 11:29
@changeset-bot

changeset-botBot commented Jun 25, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: f3ac57a

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

This PR includes changesets to release 1 package
NameType
capnwebMinor

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

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

@ttmx

ttmx commented Jun 25, 2026

Copy link
Copy Markdown
ContributorAuthor

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

github-actionsBot added a commit that referenced this pull request Jun 25, 2026
@ttmxttmx changed the title Support ArrayBuffer and Buffer Views serializationfeat: Support ArrayBuffer and Buffer Views serializationJun 25, 2026

@kentonvkentonv left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Design looks good to me. I'm overloaded and don't have time to review line-by-line, maybe @dimitropoulos or @teamchong can take it.

Comment threadprotocol.md Outdated
@pkg-pr-new

pkg-pr-newBot commented Jun 25, 2026

Copy link
Copy Markdown

Open in StackBlitz

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

commit: f3ac57a

Comment threadprotocol.md
Comment threadsrc/serialize.ts Outdated
Comment threadsrc/serialize.ts Outdated
@ndisidore

Copy link
Copy Markdown
Member

/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.

Reviewed the ArrayBuffer / typed-array serialization support. The design is solid and I'm glad to see the earlier review feedback addressed: the misalignment validation, little-endian wire order, and the minor version bump are all in place, and the test coverage is thorough (offset views, endianness, misalignment, unknown markers).

A few things worth considering below. None are blocking, but the "Uint8Array" marker robustness gap and the swapByteOrder missing default are worth a look.

Notes / questions:

  1. Incoming "Uint8Array" marker throws. The serializer intentionally emits the 2-element legacy form for Uint8Array, but a different or future implementation could legitimately send ["bytes", b64, "Uint8Array"]. That currently falls through to the default case and throws Unknown bytes type marker: Uint8Array. Since the protocol doc lists the marker set explicitly, it may be worth either (a) accepting "Uint8Array" (and "Buffer"?) as valid inbound markers, or (b) documenting in protocol.md that Uint8Array must always use the 2-element form. Deciding this now avoids a compatibility footgun later.

  2. The 12-case prototype switch in Devaluator duplicates the marker names already listed in core.ts and the deserialize switch. A single prototype→name map (or reusing one shared constant) would reduce the chance of these three lists drifting apart over time. Stylistic, but this is exactly the kind of triplicated list that tends to rot.

Comment threadsrc/serialize.ts
Comment threadsrc/serialize.ts Outdated
Comment threadsrc/serialize.ts Outdated
Comment threadprotocol.md
@ask-bonk

ask-bonkBot commented Jul 15, 2026

Copy link
Copy Markdown

Review submitted successfully. Here's a summary of what I found:

Review of PR #201: ArrayBuffer and Buffer Views serialization

The PR is well-executed. The prior reviewer feedback (from ndisidore and kentonv) has all been addressed:

  • Misalignment validation (byteLength % elementSize) — added
  • Little-endian wire order mandated and implemented
  • Version bump corrected to minor (not patch)
  • Explicit type list added to protocol.md

Non-blocking notes I posted:

  1. Inbound "Uint8Array" marker throws — the serializer only ever emits the 2-element legacy form for Uint8Array, so an incoming explicit "Uint8Array" marker (from another implementation) falls into the default case and throws. Worth either accepting it or explicitly documenting the rule in protocol.md.

  2. swapByteOrder has no default case — silently no-ops on an unexpected elementSize. Currently unreachable, but a default: throw would fail loudly on misuse. Posted a suggestion.

  3. Triplicated type lists — the prototype switch in Devaluator, TYPED_ARRAY_ELEMENT_SIZE, and the deserialize switch all enumerate overlapping subsets of the same type set; a shared table would prevent drift.

  4. Defensive .slice() copy — correct and necessary (guards against Node Buffer pooling); suggested a clarifying comment.

  5. protocol.md — spec is silent on unknown-marker behavior and the Uint8Array rule; documenting these would firm up the wire contract for other implementations.

No correctness bugs found in the happy path or the endianness handling; the tests are host-independent and cover the important edge cases.

github run

Comment threadsrc/serialize.ts
@kentonv

Copy link
Copy Markdown
Member

/bonk re-review please

@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.

Re-review. All the feedback from the previous rounds has been addressed cleanly:

  • Misalignment validation (byteLength % elementSize) — done, with a clear error message and test coverage.
  • Little-endian wire order — mandated in protocol.md and implemented via swapByteOrder; the endianness handling is host-independent and tested.
  • minor version bump — correct.
  • Explicit type list in protocol.md — added, including the unknown-marker throw behavior and the Uint8Array markerless rule that were called out last time.
  • swapByteOrder default — now throws RangeError on unsupported element sizes (the earlier suggestion).
  • Inbound explicit "Uint8Array" marker — now accepted (and tested), closing the compatibility footgun.
  • .slice() copy — documented as deliberate.

I ran tsc (no new errors in src/serialize.ts / src/core.ts) and a manual roundtrip of all 13 type markers, offset views, and the legacy/explicit Uint8Array forms — all correct.

Two small, non-blocking notes below. Nice work.

Comment threadsrc/serialize.ts
Comment threadsrc/core.ts
@ask-bonk

ask-bonkBot commented Jul 15, 2026

Copy link
Copy Markdown

Re-review submitted. Summary of my findings:

PR #201 re-review — ArrayBuffer / typed-array serialization

All prior feedback resolved. The author addressed every point from the earlier rounds (ndisidore, kenton, and the previous bonk review):

  • Misalignment validation (byteLength % elementSize) with clear errors + tests
  • Little-endian wire order mandated in protocol.md and implemented host-independently
  • minor version bump
  • Explicit supported-type list, unknown-marker behavior, and Uint8Array markerless rule documented in protocol.md
  • swapByteOrder now throws RangeError on unsupported element sizes
  • Inbound explicit "Uint8Array" marker now accepted (closes the compatibility footgun)
  • .slice() copy documented as deliberate

Verification I ran:tsc (no new errors in the changed source files — the only errors are pre-existing bun-types issues in bun.test.ts, unrelated), plus a manual roundtrip of all 13 markers, offset views, and both legacy/explicit Uint8Array forms — all correct.

Two non-blocking notes posted:

  1. The deserialize inner switch's default: marker satisfies never is compile-time-only; if hit at runtime it would fall through into case "error". Suggested adding a runtime throw.
  2. core.ts's typeForRpc case list is a fourth hand-maintained enumeration of the byte-container type set — a shared prototype constant would eliminate drift risk.

No correctness bugs found. The PR looks ready to merge modulo the maintainer's call on the two minor notes.

github run

github-actionsBot pushed a commit to ttmx/capnweb that referenced this pull request Jul 15, 2026
Co-authored-by: kentonv <kentonv@users.noreply.github.com>
@kentonv

Copy link
Copy Markdown
Member

ughh Bonk accidentally pushed a commit. It does that sometimes and we don't know why. @ttmx can you force-push remove bonk's commit? Then I think we can merge this, no other changes needed.

@ttmx
ttmxforce-pushed the feat/bufferviews-serialization branch from cce656c to f3ac57aCompareJuly 16, 2026 00:00
@kentonv
kentonv merged commit 7325f9d into cloudflare:mainJul 16, 2026
9 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Jul 16, 2026
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

@ttmx@ndisidore@kentonv