encodeJsTransferValue function
Encodes a Dart object into JSF's transfer schema.
This is a snapshot conversion. Use JsValue handles when JavaScript object
identity, prototypes, functions, or host objects must be preserved.
Implementation
Object? encodeJsTransferValue(Object? value) {
if (value == null || value is bool || value is String) {
return value;
}
if (value is int) {
return value;
}
if (value is double) {
if (value.isNaN) {
return {r'$jsf.type': 'Number', 'value': 'NaN'};
}
if (value == double.infinity) {
return {r'$jsf.type': 'Number', 'value': 'Infinity'};
}
if (value == double.negativeInfinity) {
return {r'$jsf.type': 'Number', 'value': '-Infinity'};
}
if (value == 0 && value.isNegative) {
return {r'$jsf.type': 'Number', 'value': '-0'};
}
return value;
}
if (value is JsUndefined) {
return {r'$jsf.type': 'Undefined'};
}
if (value is JsArrayHole) {
return {r'$jsf.type': 'ArrayHole'};
}
if (value is BigInt) {
return {r'$jsf.type': 'BigInt', 'value': value.toString()};
}
if (value is DateTime) {
return {
r'$jsf.type': 'Date',
'value': value.toUtc().toIso8601String(),
};
}
if (value is JsRegExp) {
return {
r'$jsf.type': 'RegExp',
'source': value.source,
'flags': value.flags
};
}
if (value is JsErrorDetails) {
return {
r'$jsf.type': 'Error',
'name': value.name,
'message': value.message,
if (value.stack != null) 'stack': value.stack,
};
}
if (value is Uint8List) {
return {r'$jsf.type': 'ArrayBuffer', 'bytes': value.toList()};
}
if (value is JsTypedArray) {
return {
r'$jsf.type': 'TypedArray',
'name': value.name,
'values': value.values,
};
}
if (value is Set) {
return {
r'$jsf.type': 'Set',
'values': value.map(encodeJsTransferValue).toList(growable: false),
};
}
if (value is Iterable) {
return value.map(encodeJsTransferValue).toList(growable: false);
}
if (value is Map) {
return value.map(
(key, item) => MapEntry(key.toString(), encodeJsTransferValue(item)),
);
}
throw ArgumentError.value(
value,
'value',
'Unsupported JavaScript interop value type: ${value.runtimeType}.',
);
}