FlowExperimentDocumentContract constructor
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,
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,
);
}