FlowExperimentDocumentContract constructor

FlowExperimentDocumentContract({
  1. required Surface surfaceType,
  2. required String flowId,
  3. required int version,
  4. required int schemaVersion,
  5. required int minClient,
  6. required FlowContentHash contentHash,
  7. required List<LibraryRequirement> requiredLibraries,
  8. required FlowDocument flowDocument,
})

Creates and independently validates a document wrapper.

Implementation

factory FlowExperimentDocumentContract({
  required Surface surfaceType,
  required String flowId,
  required int version,
  required int schemaVersion,
  required int minClient,
  required FlowContentHash contentHash,
  required List<LibraryRequirement> requiredLibraries,
  required FlowDocument flowDocument,
}) {
  _checkIdentifier(flowId, r'$.flowId');
  _checkPositiveInt(version, r'$.version');
  if (schemaVersion != _flowDocumentSchemaVersion) {
    throw FormatException(
      'Unsupported flow document schemaVersion $schemaVersion.',
    );
  }
  _checkPositiveInt(minClient, r'$.minClient');

  final canonicalLibraries = _canonicalRequiredLibraries(
    requiredLibraries,
    r'$.requiredLibraries',
  );
  final productionBytes =
      Uint8List.fromList(FlowDocumentCodec.encodeCanonicalJson(flowDocument));
  final actualHash = FlowContentHash.compute(productionBytes);
  if (actualHash != contentHash) {
    throw FormatException(
      'Flow document contentHash mismatch for "$flowId": expected '
      '${contentHash.value}, got ${actualHash.value}.',
    );
  }
  if (flowDocument.flow != flowId ||
      flowDocument.version != version ||
      flowDocument.schemaVersion != schemaVersion ||
      flowDocument.minClient != minClient) {
    throw FormatException(
      'Flow document wrapper metadata does not match "$flowId".',
    );
  }

  final parsedProduction = _StrictJsonParser(productionBytes).parse();
  final nestedCanonicalBytes =
      Uint8List.fromList(_CanonicalJsonWriter.encode(parsedProduction));
  return FlowExperimentDocumentContract._(
    surfaceType: surfaceType,
    flowId: flowId,
    version: version,
    schemaVersion: schemaVersion,
    minClient: minClient,
    contentHash: contentHash,
    requiredLibraries: canonicalLibraries,
    productionFlowDocumentBytes: productionBytes,
    canonicalFlowDocumentBytes: nestedCanonicalBytes,
  );
}