bare-structured-clone
Structured cloning algorithm for JavaScript
v2.0.1bare-structured-clone — Structured cloning algorithm for JavaScript. It is a native addon and requires Bare >=1.2.0.
npm i bare-structured-cloneUsage
const structuredClone = require('bare-structured-clone')
const copy = structuredClone({ hello: 'world' })
const buffer = new ArrayBuffer(4)
const transferred = structuredClone(buffer, { transfer: [buffer] })To install structuredClone as a global, require the global submodule:
require('bare-structured-clone/global')
const copy = structuredClone({ hello: 'world' })API
DataCloneError
DataCloneError.ALREADY_TRANSFERRED(msg: string): DataCloneError
Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
msg | string | — | The error message. |
Returns DataCloneError — A new DataCloneError with code ALREADY_TRANSFERRED.
DataCloneError.INVALID_ARRAY_LAYOUT(msg: string): DataCloneError
Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
msg | string | — | The error message. |
Returns DataCloneError — A new DataCloneError with code INVALID_ARRAY_LAYOUT.
DataCloneError.INVALID_INTERFACE(msg: string): DataCloneError
Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
msg | string | — | The error message. |
Returns DataCloneError — A new DataCloneError with code INVALID_INTERFACE.
DataCloneError.INVALID_PROPERTY_KEY(msg: string): DataCloneError
Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
msg | string | — | The error message. |
Returns DataCloneError — A new DataCloneError with code INVALID_PROPERTY_KEY.
DataCloneError.INVALID_REFERENCE(msg: string): DataCloneError
Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
msg | string | — | The error message. |
Returns DataCloneError — A new DataCloneError with code INVALID_REFERENCE.
DataCloneError.INVALID_TYPE(msg: string): DataCloneError
Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
msg | string | — | — |
DataCloneError.INVALID_VERSION(msg: string): DataCloneError
Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
msg | string | — | The error message. |
Returns DataCloneError — A new DataCloneError with code INVALID_VERSION.
DataCloneError.INVALID_VIEW(msg: string): DataCloneError
Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
msg | string | — | — |
DataCloneError.UNSERIALIZABLE_TYPE(msg: string): DataCloneError
Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
msg | string | — | The error message. |
Returns DataCloneError — A new DataCloneError with code UNSERIALIZABLE_TYPE.
DataCloneError.UNTRANSFERABLE_TYPE(msg: string): DataCloneError
Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
msg | string | — | The error message. |
Returns DataCloneError — A new DataCloneError with code UNTRANSFERABLE_TYPE.
Functions
structuredClone
structuredClone<T extends SerializableValue | TransferableValue>(value: T, opts?: StructuredCloneOptions): TClone value by serializing and then deserializing it. opts may include a transfer list and
an interfaces list.
Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
value | T | — | The value to clone. |
opts? | StructuredCloneOptions | — | Options carrying the optional transfer and interfaces lists. |
Returns T — A deep copy of value, with any transferred objects detached from the original.
Throws
UNSERIALIZABLE_TYPE—value, or a value it references, is of a type that cannot be serialized (for example a function, a symbol, or a detachedArrayBuffer).UNTRANSFERABLE_TYPE— a value in thetransferlist cannot be transferred.ALREADY_TRANSFERRED— a value in thetransferlist has already been transferred.INVALID_INTERFACE— a serializable or transferable value has an interface that is not present in theinterfaceslist.
structuredClone.deserialize
structuredClone.deserialize<T extends SerializableValue>(serialized: SerializedValue, interfaces?: (SerializableConstructor | TransferableConstructor)[]): TParameters
| Parameter | Type | Default | Description |
|---|---|---|---|
serialized | SerializedValue | — | A value previously produced by serialize. |
interfaces? | (SerializableConstructor | TransferableConstructor)[] | — | Serializable and transferable constructors to recognize when deserializing custom platform objects. |
Returns T — The value reconstructed from serialized.
structuredClone.deserializeWithTransfer
structuredClone.deserializeWithTransfer<T extends SerializableValue | TransferableValue>(serialized: SerializedTransfer, interfaces?: (SerializableConstructor | TransferableConstructor)[]): TParameters
| Parameter | Type | Default | Description |
|---|---|---|---|
serialized | SerializedTransfer | — | A value previously produced by serializeWithTransfer. |
interfaces? | (SerializableConstructor | TransferableConstructor)[] | — | Serializable and transferable constructors to recognize when deserializing custom platform objects. |
Returns T — The value reconstructed from serialized, with its transferred objects re-attached.
structuredClone.serialize
structuredClone.serialize(value: SerializableValue, forStorage?: boolean, interfaces?: (SerializableConstructor | TransferableConstructor)[]): SerializedValueParameters
| Parameter | Type | Default | Description |
|---|---|---|---|
value | SerializableValue | — | The value to serialize. |
forStorage? | boolean | — | Whether the serialized form will be persisted rather than sent across a boundary immediately. |
interfaces? | (SerializableConstructor | TransferableConstructor)[] | — | Serializable and transferable constructors to recognize when serializing custom platform objects. |
Returns SerializedValue — A serialized representation of value.
structuredClone.serializeWithTransfer
structuredClone.serializeWithTransfer(value: SerializableValue | TransferableValue, transferList?: TransferableValue[], interfaces?: (SerializableConstructor | TransferableConstructor)[]): SerializedTransferParameters
| Parameter | Type | Default | Description |
|---|---|---|---|
value | SerializableValue | TransferableValue | — | The value to serialize. |
transferList? | TransferableValue[] | — | Transferable objects to include in the transfer list; each is detached from the original after serializing. |
interfaces? | (SerializableConstructor | TransferableConstructor)[] | — | Serializable and transferable constructors to recognize when serializing custom platform objects. |
Returns SerializedTransfer — A serialized representation of value, plus its transfer list.
Constants and variables
structuredClone.constants
structuredClone.constants: {
VERSION: number
type: {
// Primitive types
UNDEFINED: 0
NULL: 1
TRUE: 2
FALSE: 3
NUMBER: 4
INTEGER: 5
BIGINT: 6
STRING: 7
// Builtin objects
DATE: 8
REGEXP: 9
ERROR: 10
// Builtin binary data objects
ARRAYBUFFER: 11
RESIZABLEARRAYBUFFER: 12
SHAREDARRAYBUFFER: 13
GROWABLESHAREDARRAYBUFFER: 14
TYPEDARRAY: 15
DATAVIEW: 16
// Builtin composite objects
MAP: 17
SET: 18
ARRAY: 19
OBJECT: 20
// Object references
REFERENCE: 21
// Object transfers
TRANSFER: 22
// Platform objects
URL: 23
BUFFER: 24
EXTERNAL: 25
SERIALIZABLE: 26
TRANSFERABLE: 27
typedarray: {
UINT8ARRAY: 1
UINT8CLAMPEDARRAY: 2
INT8ARRAY: 3
UINT16ARRAY: 4
INT16ARRAY: 5
UINT32ARRAY: 6
INT32ARRAY: 7
BIGUINT64ARRAY: 8
BIGINT64ARRAY: 9
FLOAT16ARRAY: 12
FLOAT32ARRAY: 10
FLOAT64ARRAY: 11
}
error: {
AGGREGATE: 1
EVAL: 2
RANGE: 3
REFERENCE: 4
SYNTAX: 5
TYPE: 6
URI: 7
}
// Property key kinds
key: {
INDEX: 1
NAME: 2
NAME_REFERENCE: 3
}
// Array layouts
array: {
DENSE: 1
SPARSE: 2
}
}
}Numeric tags used in serialized values. Also available as
require('bare-structured-clone/constants').
structuredClone.symbols
structuredClone.symbols: {
readonly serialize: unique symbol
readonly deserialize: unique symbol
readonly detach: unique symbol
readonly attach: unique symbol
readonly interface: unique symbol
}Types
structuredClone.SerializableValue
type SerializableValue = | undefined
| null
| boolean
| number
| bigint
| string
| Date
| RegExp
| Error
| ArrayBuffer
| SharedArrayBuffer
| Uint8Array
| Uint8ClampedArray
| Int8Array
| Uint16Array
| Int16Array
| Uint32Array
| Int32Array
| BigUint64Array
| BigInt64Array
| Float16Array
| Float32Array
| Float64Array
| DataView
| Map<SerializableValue, SerializableValue>
| Set<SerializableValue>
| SerializableValue[]
| { [key: string | number]: SerializableValue }
| URL
| Buffer
| SerializablestructuredClone.TransferableValue
type TransferableValue = ArrayBuffer | TransferableStructuredCloneOptions
interface StructuredCloneOptions {
transfer: TransferableValue[]
interfaces: (SerializableConstructor | TransferableConstructor)[]
}SerializableConstructor
interface SerializableConstructor<T = unknown> {
}TransferableConstructor
interface TransferableConstructor<T = unknown> {
}SerializedTransfer
interface SerializedTransfer {
type: typeof constants.type.TRANSFER
transfers: (
| SerializedArrayBufferTransfer
| SerializedResizableArrayBufferTransfer
| SerializedTransferableTransfer
)[]
value: SerializedValue
}SerializedArrayBufferTransfer
interface SerializedArrayBufferTransfer {
type: typeof constants.type.ARRAYBUFFER
id: number
backingStore: ArrayBuffer
}SerializedResizableArrayBufferTransfer
interface SerializedResizableArrayBufferTransfer {
type: typeof constants.type.RESIZABLEARRAYBUFFER
id: number
backingStore: ArrayBuffer
maxByteLength: number
}SerializedTransferableTransfer
interface SerializedTransferableTransfer {
type: typeof constants.type.TRANSFERABLE
id: number
interface: number
value: SerializedValue
}Classes
Serializable
class Serializable {
}Base class for a custom serializable type. A subclass implements [symbols.serialize](forStorage), returning the SerializableValue to serialize, and a static [symbols.deserialize](serialized), returning a new instance reconstructed from it. The subclass's constructor must be registered via the interfaces option on both ends of the clone.
Transferable
class Transferable {
detached: boolean
}Base class for a custom transferable type. A subclass implements [symbols.detach](), releasing ownership and returning the SerializableValue to serialize, and a static [symbols.attach](serialized), returning a new instance that takes ownership of serialized. The base [symbols.detach]() implementation sets detached to true; a subclass should call super[symbols.detach]() after releasing its own state. The subclass's constructor must be registered via the interfaces option on both ends of the clone.
bare-structured-clone/constants
Constants and variables
constants
constants: {
VERSION: number
type: {
// Primitive types
UNDEFINED: 0
NULL: 1
TRUE: 2
FALSE: 3
NUMBER: 4
INTEGER: 5
BIGINT: 6
STRING: 7
// Builtin objects
DATE: 8
REGEXP: 9
ERROR: 10
// Builtin binary data objects
ARRAYBUFFER: 11
RESIZABLEARRAYBUFFER: 12
SHAREDARRAYBUFFER: 13
GROWABLESHAREDARRAYBUFFER: 14
TYPEDARRAY: 15
DATAVIEW: 16
// Builtin composite objects
MAP: 17
SET: 18
ARRAY: 19
OBJECT: 20
// Object references
REFERENCE: 21
// Object transfers
TRANSFER: 22
// Platform objects
URL: 23
BUFFER: 24
EXTERNAL: 25
SERIALIZABLE: 26
TRANSFERABLE: 27
typedarray: {
UINT8ARRAY: 1
UINT8CLAMPEDARRAY: 2
INT8ARRAY: 3
UINT16ARRAY: 4
INT16ARRAY: 5
UINT32ARRAY: 6
INT32ARRAY: 7
BIGUINT64ARRAY: 8
BIGINT64ARRAY: 9
FLOAT16ARRAY: 12
FLOAT32ARRAY: 10
FLOAT64ARRAY: 11
}
error: {
AGGREGATE: 1
EVAL: 2
RANGE: 3
REFERENCE: 4
SYNTAX: 5
TYPE: 6
URI: 7
}
// Property key kinds
key: {
INDEX: 1
NAME: 2
NAME_REFERENCE: 3
}
// Array layouts
array: {
DENSE: 1
SPARSE: 2
}
}
}Numeric tags used in serialized values. Also available as
require('bare-structured-clone/constants').
bare-structured-clone/errors
DataCloneError
errors.DataCloneError.ALREADY_TRANSFERRED(msg: string): DataCloneError
Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
msg | string | — | The error message. |
Returns DataCloneError — A new DataCloneError with code ALREADY_TRANSFERRED.
errors.DataCloneError.INVALID_ARRAY_LAYOUT(msg: string): DataCloneError
Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
msg | string | — | The error message. |
Returns DataCloneError — A new DataCloneError with code INVALID_ARRAY_LAYOUT.
errors.DataCloneError.INVALID_INTERFACE(msg: string): DataCloneError
Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
msg | string | — | The error message. |
Returns DataCloneError — A new DataCloneError with code INVALID_INTERFACE.
errors.DataCloneError.INVALID_PROPERTY_KEY(msg: string): DataCloneError
Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
msg | string | — | The error message. |
Returns DataCloneError — A new DataCloneError with code INVALID_PROPERTY_KEY.
errors.DataCloneError.INVALID_REFERENCE(msg: string): DataCloneError
Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
msg | string | — | The error message. |
Returns DataCloneError — A new DataCloneError with code INVALID_REFERENCE.
errors.DataCloneError.INVALID_TYPE(msg: string): DataCloneError
Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
msg | string | — | — |
errors.DataCloneError.INVALID_VERSION(msg: string): DataCloneError
Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
msg | string | — | The error message. |
Returns DataCloneError — A new DataCloneError with code INVALID_VERSION.
errors.DataCloneError.INVALID_VIEW(msg: string): DataCloneError
Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
msg | string | — | — |
errors.DataCloneError.UNSERIALIZABLE_TYPE(msg: string): DataCloneError
Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
msg | string | — | The error message. |
Returns DataCloneError — A new DataCloneError with code UNSERIALIZABLE_TYPE.
errors.DataCloneError.UNTRANSFERABLE_TYPE(msg: string): DataCloneError
Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
msg | string | — | The error message. |
Returns DataCloneError — A new DataCloneError with code UNTRANSFERABLE_TYPE.
Threat model
bare-structured-clone is one of the addons Bare compiles into its binary, so every Bare process has it, sealed or not, and it inherits Bare's threat model. The module's own threat model, added in v2.0.1, says where it sits in that one. It turns bytes into typed values and reaches the backing stores of ArrayBuffer and SharedArrayBuffer, and thread messaging and transfer lists run on it, so a malformed input is a memory-safety concern rather than a wrong answer.
See also
- Builds on
bare-buffer,bare-type, andbare-url. bare-channelandbare-broadcast-channel— inter-thread messaging built on this.- Bare modules — the full
bare-*catalog. - Bare runtime API — the runtime these modules extend.
Last updated on