public async run()

in src/commands/repair-package-data.ts [40:117]


  public async run() {
    const {
      flags: {
        'batch-size': fixBatchSize,
        'only-catalog': onlyCatalog,
        'bucket': bucketName,
        'state-machine': stateMachine,
        languages,
      },
    } = this.parse(RepairPackageData);

    const credentials = defaultProvider({ maxRetries: 10 });

    const S3 = new S3Client({ credentials });
    const SFN = new SFNClient({ credentials });

    const ns = uuidv4();
    const runningMachines = new Map<string, Promise<{ readonly arn: string; readonly status: string }>>();
    const highWaterMark = 50;
    const lowWaterMark = Math.max(0, highWaterMark - fixBatchSize);

    const broken = new Array<[PackageVersionStatus, readonly string[]]>();
    const packageVersionPrefixes = onlyCatalog
      ?this.packageVersionPrefixesFromCatalog(S3, bucketName)
      : this.packageVersionPrefixes(S3, bucketName);
    for await (const prefix of packageVersionPrefixes) {
      const status = await this.processPackageVersion(S3, bucketName, prefix);
      if (!status.assemblyKey || !status.metadataKey || !status.tarballKey) {
        console.error(
          `${chalk.blue.bold(status.name)}@${chalk.blue.bold(status.version)}`,
          chalk.red('has missing base objects'),
          ' - ',
          [
            `assembly: ${status.assemblyKey ? chalk.bgGreen('PRESENT') : chalk.bgRed('MISSING')}`,
            `metadata: ${status.metadataKey ? chalk.bgGreen('PRESENT') : chalk.bgRed('MISSING')}`,
            `tarball: ${status.tarballKey ? chalk.bgGreen('PRESENT') : chalk.bgRed('MISSING')}`,
          ].join(', '),
        );
        continue;
      }
      const missingLanguages = new Set<string>();
      for (const language of languages) {
        if (status.docs.get(language) == null) {
          missingLanguages.add(language);
        }
        for (const subStatus of status.submodules.values()) {
          if (subStatus.get(language) == null) {
            missingLanguages.add(language);
          }
        }
      }
      if (missingLanguages.size > 0) {
        console.log(`${chalk.blue.bold(status.name)}@${chalk.blue.bold(status.version)} is missing documents for ${Array.from(missingLanguages).map((l) => chalk.green(l)).join(', ')}`);
        broken.push([status, Array.from(missingLanguages)]);
      }

      if (stateMachine && broken.length >= fixBatchSize) {
        if (runningMachines.size >= highWaterMark) {
          await this.waitForSettlements(runningMachines, lowWaterMark);
        }
        const { executionArns } = await this.repairPackageVersions(SFN, bucketName, stateMachine, broken, ns);
        for (const arn of executionArns.values()) {
          runningMachines.set(arn, this.awaitStateMachineEnd(SFN, arn));
        }
        broken.splice(0, broken.length);
      }
    }

    if (stateMachine) {
      if (runningMachines.size >= highWaterMark) {
        await this.waitForSettlements(runningMachines, lowWaterMark);
      }
      const { executionArns } = await this.repairPackageVersions(SFN, bucketName, stateMachine, broken, ns);
      for (const arn of executionArns.values()) {
        runningMachines.set(arn, this.awaitStateMachineEnd(SFN, arn));
      }
    }
  }