///
import * as grpc from 'grpc';
import * as Builder from './builder';
import * as RPC from './rpc';
import { NSApplicator } from './util';
/**
* Isolation level which can be passed into the ISTMOptions.
*/
export declare const enum Isolation {
/**
* SerializableSnapshot provides serializable isolation and
* also checks for write conflicts.
*/
SerializableSnapshot = 0,
/**
* Serializable reads within the same transaction attempt return data
* from the at the revision of the first read.
*/
Serializable = 1,
/**
* RepeatableReads reads within the same transaction attempt always
* return the same data.
*/
RepeatableReads = 2,
/**
* ReadCommitted reads keys from any committed revision.
*/
ReadCommitted = 3
}
/**
* ISTMOptions are optionally passed to `etcd3.stm(options)`.
*/
export interface ISTMOptions {
/**
* Number of times we'll retry the transaction if we get a conflict.
* Defaults to 3.
*/
retries: number;
/**
* WithPrefetch is a hint to prefetch a list of keys before trying to apply.
* If an STM transaction will unconditionally fetch a set of keys, prefetching
* those keys will save the round-trip cost from requesting
* each key one by one with `.get()`.
*/
prefetch: string[];
/**
* Isolation level for the transaction. Defaults to SerializableSnapshot.
*/
isolation: Isolation;
/**
* Options to pass into the STM transaction's commit.
*/
callOptions?: grpc.CallOptions;
}
/**
* SoftwareTransaction is an implementation of software transaction memory,
* described in greater detail [here](https://coreos.com/blog/transactional-memory-with-etcd3.html).
* The idea is that you can have a block that contains multiple reads
* and writes, then we'll commit all those changes as a single transaction,
* automatically retrying as necessary.
*
* Inside the `.transact()` block, all reads and writes **must** go through
* the transaction, not the client, or they won't be tracked.
*
* For example, this is a safe way to move 'money' between `bank/account1` and
* `bank/account2`:
*
* ```js
* const amount = 42;
*
* etcd3.stm().transact(tx => {
* return Promise.all([
* tx.get('bank/account1').number(),
* tx.get('bank/account2').number(),
* ]).then(([balance1, balance2]) => {
* if (balance1 < amount) {
* throw new Error('You do not have enough money to transfer!');
* }
*
* return Promise.all([
* tx.put('bank/account1').value(balance1 - amount),
* tx.put('bank/account2').value(balance2 + amount),
* });
* });
* });
* ```
*
* (Note: the author does not condone using etcd for your banking infrastructure)
*/
export declare class SoftwareTransaction {
private readonly options;
private readonly namespace;
private readonly rawKV;
private readonly kv;
private tx;
constructor(options: ISTMOptions, namespace: NSApplicator, rawKV: RPC.KVClient);
/**
* transact runs the function with the current configuration. It will be
* retried until the transaction succeeds, or until the maximum number of
* retries has been exceeded.
*/
transact(fn: (tx: this) => T | PromiseLike): Promise;
/**
* `.get()` starts a query to look up a single key from etcd.
*/
get(key: string): Builder.SingleRangeBuilder;
/**
* `.put()` starts making a put request against etcd.
*/
put(key: string | Buffer): Builder.PutBuilder;
/**
* `.delete()` starts making a delete request against etcd.
*/
delete(): Builder.DeleteBuilder;
private transactInner;
private commit;
}