Skip to content

Commit 792dece

Browse files
committed
fix: ensure TextEncoder never returns pooled arrays
Previous impl always ensured 0-offset arrays, but not that there is no data _past_ the returned view. This only affects Node.js-like platforms, as only there native buffers are pooled.
1 parent 97f1524 commit 792dece

File tree

2 files changed

+23
-1
lines changed

2 files changed

+23
-1
lines changed

fallback/encoding.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,8 @@ export class TextEncoder {
211211
encode(str = '') {
212212
if (typeof str !== 'string') str = `${str}`
213213
const res = utf8fromStringLoose(str)
214-
return res.byteOffset === 0 ? res : res.slice(0) // Ensure 0-offset, to match new Uint8Array (per spec), which is non-pooled
214+
// match new Uint8Array (per spec), which is non-pooled
215+
return res.byteOffset === 0 && res.length === res.buffer.byteLength ? res : res.slice(0)
215216
}
216217

217218
encodeInto(str, target) {

tests/encoding/nopool.test.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { TextEncoder } from '@exodus/bytes/encoding.js'
2+
import { test } from 'node:test'
3+
4+
test('TextEncoder returns non-pooled buffers', (t) => {
5+
const encoder = new TextEncoder()
6+
for (let i = 0; i < 256; i++) {
7+
t.assert.strictEqual(encoder.encode('x'.repeat(128)).buffer.byteLength, 128)
8+
}
9+
10+
for (let i = 0; i < 256; i++) {
11+
t.assert.strictEqual(encoder.encode('x'.repeat(64)).buffer.byteLength, 64)
12+
}
13+
14+
for (let i = 0; i < 512; i++) {
15+
t.assert.strictEqual(encoder.encode('x'.repeat(32)).buffer.byteLength, 32)
16+
}
17+
18+
for (let i = 0; i < 512; i++) {
19+
t.assert.strictEqual(encoder.encode('').buffer.byteLength, 0)
20+
}
21+
})

0 commit comments

Comments
 (0)