encodeJsTransferValue function

Object? encodeJsTransferValue(
  1. Object? value
)

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}.',
  );
}