blob: cb95ece884945471e8f33d8ba47dd4aee913c56b [file]
// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'dart:typed_data';
import 'package:analyzer/src/binary/binary_reader.dart';
import 'package:analyzer/src/binary/binary_writer.dart';
import 'package:meta/meta.dart';
class PackageBundleBuilder {
final List<PackageBundleLibrary> _libraries = [];
void addLibrary(String uriStr, List<String> unitUriStrList) {
_libraries.add(
PackageBundleLibrary(
uriStr,
unitUriStrList.map((e) => PackageBundleUnit(e)).toList(),
),
);
}
Uint8List finish({
required Uint8List resolutionBytes,
PackageBundleSdk? sdk,
}) {
var writer = BinaryWriter();
if (sdk != null) {
writer.writeByte(1);
sdk._write(writer);
} else {
writer.writeByte(0);
}
writer.writeList(_libraries, (PackageBundleLibrary library) {
writer.writeStringUtf8(library.uriStr);
writer.writeList(
library.units,
(PackageBundleUnit unit) => writer.writeStringUtf8(unit.uriStr),
);
});
writer.writeUint8List(resolutionBytes);
return writer.takeBytes();
}
}
@internal
class PackageBundleLibrary {
final String uriStr;
final List<PackageBundleUnit> units;
PackageBundleLibrary(this.uriStr, this.units);
}
class PackageBundleReader {
final List<PackageBundleLibrary> libraries = [];
late final PackageBundleSdk? _sdk;
late final Uint8List _resolutionBytes;
PackageBundleReader(Uint8List bytes) {
var reader = BinaryReader(bytes);
var hasSdk = reader.readByte() != 0;
if (hasSdk) {
_sdk = PackageBundleSdk._fromReader(reader);
}
var librariesLength = reader.readUint30();
for (var i = 0; i < librariesLength; i++) {
var uriStr = reader.readStringUtf8();
var unitsLength = reader.readUint30();
var units = List.generate(unitsLength, (_) {
var uriStr = reader.readStringUtf8();
return PackageBundleUnit(uriStr);
});
libraries.add(PackageBundleLibrary(uriStr, units));
}
_resolutionBytes = reader.readUint8List();
}
Uint8List get resolutionBytes => _resolutionBytes;
PackageBundleSdk? get sdk => _sdk;
}
class PackageBundleSdk {
final int languageVersionMajor;
final int languageVersionMinor;
/// The content of the `allowed_experiments.json` from SDK.
final String allowedExperimentsJson;
PackageBundleSdk({
required this.languageVersionMajor,
required this.languageVersionMinor,
required this.allowedExperimentsJson,
});
factory PackageBundleSdk._fromReader(BinaryReader reader) {
return PackageBundleSdk(
languageVersionMajor: reader.readUint30(),
languageVersionMinor: reader.readUint30(),
allowedExperimentsJson: reader.readStringUtf8(),
);
}
void _write(BinaryWriter writer) {
writer.writeUint30(languageVersionMajor);
writer.writeUint30(languageVersionMinor);
writer.writeStringUtf8(allowedExperimentsJson);
}
}
@internal
class PackageBundleUnit {
final String uriStr;
PackageBundleUnit(this.uriStr);
}