11
Github GitHub - Jack-Works/proposal-readonly-arraybuffer
source link: https://github.com/Jack-Works/proposal-readonly-arraybuffer/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
Freeze ArrayBuffer and Readonly view to ArrayBuffer
Status
Champion(s): Jack Works
Author(s): Jack Works
Stage: 0
Related proposal: Fixed view of ArrayBuffer
Presentations
Motivation
Security
We can have frozen objects (via Object.freeze
) but not for binary data today.
Performance
- Developers might copy the whole ArrayBuffer if they want to prevent external code to modify that ArrayBuffer. The copy brings the performance lost.
- Engines can safely share the memory across different Realms/processes if the ArrayBuffer is read-only.
Target
- Add a new way to freeze the ArrayBuffer.
- One-way. Once it froze, there is no way back.
- All views to the frozen ArrayBuffer are read-only too.
- If it is sent across Realms/processes, it is still frozen.
- Add a new way to create a read-only view to a read-write ArrayBuffer.
- Cannot construct the read-write view from
readOnlyView.buffer
- Cannot construct the read-write view from
Possible API design
// Mutate this, not copy & return a new one. ArrayBuffer.prototype.freeze(): ArrayBuffer ArrayBuffer.prototype.isFrozen(): boolean // One of the following: new TypedArray(buffer, { readonly: true }) new TypedArray(arrayBuffer.frozenView) TypedArray.prototype.freeze(), TypedArray.prototype.isFrozen()
Freeze ArrayBuffer
const buffer = new ArrayBuffer(8) const view = new Int32Array(buffer) view[0] = 42 // OK buffer.freeze() view[0] = 42 // TypeError buffer.isFrozen() // true
Readonly view to ArrayBuffer
const buffer = new ArrayBuffer(8) // This one? function createROInt32Array(buffer) { return new Int32Array(buffer, { readonly: true }) } // This one? function createROInt32Array(buffer) { const view = new Int32Array(buffer) view.freeze() return view } // Or this one? function createROInt32Array(buffer) { const view = new Int32Array(buffer.frozenView) // view.buffer === buffer.frozenView // view.buffer.buffer === view.buffer return view } const roView = createROInt32Array(buffer) const rwView = new Int32Array(buffer) roView[0] = 42 // TypeError rwView[0] = 42 // OK const tryEscape = roView.buffer const newView = new Int32Array(tryEscape) newView[0] = 42 // still TypeError roView.buffer !== rwView
Integrate with Tuple & Records?
const buffer = new ArrayBuffer(8) fillBuffer(buffer) buffer.freeze() const data = #{ binary: buffer // yay! }
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK