private async start()

in src/election.ts [275:307]


  private async start() {
    const leaseId = await this.lease.grant();

    const originalValue = this.value;
    const result = await this.namespace
      .if(leaseId, 'Create', '==', 0)
      .then(this.namespace.put(leaseId).value(originalValue).lease(leaseId))
      .else(this.namespace.get(leaseId))
      .commit();

    if (this.keyRevision === ResignedCampaign) {
      return; // torn down in the meantime
    }

    this.keyRevision = result.header.revision;

    if (result.succeeded) {
      if (this.pendingProclaimation) {
        await this.proclaimInner(this.value, this.keyRevision);
        this.pendingProclaimation.resolve();
      }
    } else {
      const kv = result.responses[0].response_range.kvs[0];
      this.keyRevision = kv.create_revision;
      if (!kv.value.equals(this.value)) {
        await this.proclaimInner(this.value, this.keyRevision);
        this.pendingProclaimation?.resolve();
      }
    }

    await this.waitForElected(result.header.revision);
    this.emit('elected');
  }