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');
}