Cloud
Tools for managing state, scheduling tasks, and interacting with key-value stores.
Eg Deno.openKv, Deno.cron
Classes
Functions
Create a cron job that will periodically execute the provided handler callback based on the specified schedule.
Interfaces
A check to perform as part of a Deno.AtomicOperation. The check
will fail if the versionstamp for the key-value pair in the KV store does
not match the given versionstamp. A check with a null versionstamp checks
that the key-value pair does not currently exist in the KV store.
CronSchedule is the interface used for JSON format
cron schedule.
Options for listing key-value pairs in a Deno.Kv.
Type Aliases
CronScheduleExpression is used as the type of minute, hour,
dayOfMonth, month, and dayOfWeek in CronSchedule.
A single part of a Deno.KvKey. Parts are ordered
lexicographically, first by their type, and within a given type by their
value.
A selector that selects the range of data returned by a list operation on a
Deno.Kv.
A mutation to a key in a Deno.Kv. A mutation is a
combination of a key, a value, and a type. The type determines how the
mutation is applied to the key.
class Deno.AtomicOperation
An operation on a Deno.Kv that can be performed
atomically. Atomic operations do not auto-commit, and must be committed
explicitly by calling the commit method.
Atomic operations can be used to perform multiple mutations on the KV store
in a single atomic transaction. They can also be used to perform
conditional mutations by specifying one or more
Deno.AtomicChecks that ensure that a mutation is only performed
if the key-value pair in the KV has a specific versionstamp. If any of the
checks fail, the entire operation will fail and no mutations will be made.
The ordering of mutations is guaranteed to be the same as the ordering of the mutations specified in the operation. Checks are performed before any mutations are performed. The ordering of checks is unobservable.
Atomic operations can be used to implement optimistic locking, where a mutation is only performed if the key-value pair in the KV store has not been modified since the last read. This can be done by specifying a check that ensures that the versionstamp of the key-value pair matches the versionstamp that was read. If the check fails, the mutation will not be performed and the operation will fail. One can then retry the read-modify- write operation in a loop until it succeeds.
The commit method of an atomic operation returns a value indicating
whether checks passed and mutations were performed. If the operation failed
because of a failed check, the return value will be a
Deno.KvCommitError with an ok: false property. If the
operation failed for any other reason (storage error, invalid value, etc.),
an exception will be thrown. If the operation succeeded, the return value
will be a Deno.KvCommitResult object with a ok: true property
and the versionstamp of the value committed to KV.
Methods #
#check(...checks: AtomicCheck[]): this Add to the operation a check that ensures that the versionstamp of the key-value pair in the KV store matches the given versionstamp. If the check fails, the entire operation will fail and no mutations will be performed during the commit.
#commit(): Promise<KvCommitResult | KvCommitError> Commit the operation to the KV store. Returns a value indicating whether
checks passed and mutations were performed. If the operation failed
because of a failed check, the return value will be a Deno.KvCommitError with an ok: false property. If the operation failed
for any other reason (storage error, invalid value, etc.), an exception
will be thrown. If the operation succeeded, the return value will be a
Deno.KvCommitResult object with a ok: true property and the
versionstamp of the value committed to KV.
If the commit returns ok: false, one may create a new atomic operation
with updated checks and mutations and attempt to commit it again. See the
note on optimistic locking in the documentation for
Deno.AtomicOperation.
Add to the operation a mutation that deletes the specified key if all checks pass during the commit.
#enqueue(value: unknown,options?: { delay?: number; keysIfUndelivered?: KvKey[]; backoffSchedule?: number[]; },): this Add to the operation a mutation that enqueues a value into the queue if all checks pass during the commit.
Shortcut for creating a max mutation. This method wraps n in a
Deno.KvU64, so the value of n must be in the range
[0, 2^64-1].
Shortcut for creating a min mutation. This method wraps n in a
Deno.KvU64, so the value of n must be in the range
[0, 2^64-1].
#mutate(...mutations: KvMutation[]): this Add to the operation a mutation that performs the specified mutation on
the specified key if all checks pass during the commit. The types and
semantics of all available mutations are described in the documentation
for Deno.KvMutation.
Add to the operation a mutation that sets the value of the specified key to the specified value if all checks pass during the commit.
Optionally an expireIn option can be specified to set a time-to-live
(TTL) for the key. The TTL is specified in milliseconds, and the key will
be deleted from the database at earliest after the specified number of
milliseconds have elapsed. Once the specified duration has passed, the
key may still be visible for some additional time. If the expireIn
option is not specified, the key will not expire.
Shortcut for creating a sum mutation. This method wraps n in a
Deno.KvU64, so the value of n must be in the range
[0, 2^64-1].
class Deno.Kv
A key-value database that can be used to store and retrieve data.
Data is stored as key-value pairs, where the key is a Deno.KvKey
and the value is an arbitrary structured-serializable JavaScript value.
Keys are ordered lexicographically as described in the documentation for
Deno.KvKey. Keys are unique within a database, and the last
value set for a given key is the one that is returned when reading the
key. Keys can be deleted from the database, in which case they will no
longer be returned when reading keys.
Values can be any structured-serializable JavaScript value (objects,
arrays, strings, numbers, etc.). The special value Deno.KvU64
can be used to store 64-bit unsigned integers in the database. This special
value can not be nested within other objects or arrays. In addition to the
regular database mutation operations, the unsigned 64-bit integer value
also supports sum, max, and min mutations.
Keys are versioned on write by assigning the key an ever-increasing "versionstamp". The versionstamp represents the version of a key-value pair in the database at some point in time, and can be used to perform transactional operations on the database without requiring any locking. This is enabled by atomic operations, which can have conditions that ensure that the operation only succeeds if the versionstamp of the key-value pair matches an expected versionstamp.
Keys have a maximum length of 2048 bytes after serialization. Values have a maximum length of 64 KiB after serialization. Serialization of both keys and values is somewhat opaque, but one can usually assume that the serialization of any value is about the same length as the resulting string of a JSON serialization of that same value. If theses limits are exceeded, an exception will be thrown.
Methods #
#[Symbol.dispose](): void Create a new Deno.AtomicOperation object which can be used to
perform an atomic transaction on the database. This does not perform any
operations on the database - the atomic transaction must be committed
explicitly using the Deno.AtomicOperation.commit method once
all checks and mutations have been added to the operation.
Close the database connection. This will prevent any further operations from being performed on the database, and interrupt any in-flight operations immediately.
#commitVersionstamp(): symbol Get a symbol that represents the versionstamp of the current atomic
operation. This symbol can be used as the last part of a key in
.set(), both directly on the Kv object and on an AtomicOperation
object created from this Kv instance.
Delete the value for the given key from the database. If no value exists for the key, this operation is a no-op.
const db = await Deno.openKv();
await db.delete(["foo"]);
#enqueue(value: unknown,options?: { delay?: number; keysIfUndelivered?: KvKey[]; backoffSchedule?: number[]; },): Promise<KvCommitResult> Add a value into the database queue to be delivered to the queue
listener via Deno.Kv.listenQueue.
const db = await Deno.openKv();
await db.enqueue("bar");
The delay option can be used to specify the delay (in milliseconds)
of the value delivery. The default delay is 0, which means immediate
delivery.
const db = await Deno.openKv();
await db.enqueue("bar", { delay: 60000 });
The keysIfUndelivered option can be used to specify the keys to
be set if the value is not successfully delivered to the queue
listener after several attempts. The values are set to the value of
the queued message.
The backoffSchedule option can be used to specify the retry policy for
failed message delivery. Each element in the array represents the number of
milliseconds to wait before retrying the delivery. For example,
[1000, 5000, 10000] means that a failed delivery will be retried
at most 3 times, with 1 second, 5 seconds, and 10 seconds delay
between each retry.
const db = await Deno.openKv();
await db.enqueue("bar", {
keysIfUndelivered: [["foo", "bar"]],
backoffSchedule: [1000, 5000, 10000],
});
#get<T = unknown>(key: KvKey,options?: { consistency?: KvConsistencyLevel; },): Promise<KvEntryMaybe<T>> Retrieve the value and versionstamp for the given key from the database
in the form of a Deno.KvEntryMaybe. If no value exists for
the key, the returned entry will have a null value and versionstamp.
const db = await Deno.openKv();
const result = await db.get(["foo"]);
result.key; // ["foo"]
result.value; // "bar"
result.versionstamp; // "00000000000000010000"
The consistency option can be used to specify the consistency level
for the read operation. The default consistency level is "strong". Some
use cases can benefit from using a weaker consistency level. For more
information on consistency levels, see the documentation for
Deno.KvConsistencyLevel.
#getMany<T extends readonly unknown[]>(keys: readonly [...[K in keyof T]: KvKey],options?: { consistency?: KvConsistencyLevel; },): Promise<[K in keyof T]: KvEntryMaybe<T[K]>> Retrieve multiple values and versionstamps from the database in the form
of an array of Deno.KvEntryMaybe objects. The returned array
will have the same length as the keys array, and the entries will be in
the same order as the keys. If no value exists for a given key, the
returned entry will have a null value and versionstamp.
const db = await Deno.openKv();
const result = await db.getMany([["foo"], ["baz"]]);
result[0].key; // ["foo"]
result[0].value; // "bar"
result[0].versionstamp; // "00000000000000010000"
result[1].key; // ["baz"]
result[1].value; // null
result[1].versionstamp; // null
The consistency option can be used to specify the consistency level
for the read operation. The default consistency level is "strong". Some
use cases can benefit from using a weaker consistency level. For more
information on consistency levels, see the documentation for
Deno.KvConsistencyLevel.
#list<T = unknown>(selector: KvListSelector,options?: KvListOptions,): KvListIterator<T> Retrieve a list of keys in the database. The returned list is an
Deno.KvListIterator which can be used to iterate over the
entries in the database.
Each list operation must specify a selector which is used to specify the range of keys to return. The selector can either be a prefix selector, or a range selector:
- A prefix selector selects all keys that start with the given prefix of
key parts. For example, the selector
["users"]will select all keys that start with the prefix["users"], such as["users", "alice"]and["users", "bob"]. Note that you can not partially match a key part, so the selector["users", "a"]will not match the key["users", "alice"]. A prefix selector may specify astartkey that is used to skip over keys that are lexicographically less than the start key. - A range selector selects all keys that are lexicographically between
the given start and end keys (including the start, and excluding the
end). For example, the selector
["users", "a"], ["users", "n"]will select all keys that start with the prefix["users"]and have a second key part that is lexicographically betweenaandn, such as["users", "alice"],["users", "bob"], and["users", "mike"], but not["users", "noa"]or["users", "zoe"].
const db = await Deno.openKv();
const entries = db.list({ prefix: ["users"] });
for await (const entry of entries) {
entry.key; // ["users", "alice"]
entry.value; // { name: "Alice" }
entry.versionstamp; // "00000000000000010000"
}
The options argument can be used to specify additional options for the
list operation. See the documentation for Deno.KvListOptions
for more information.
#listenQueue(handler: (value: any) => Promise<void> | void): Promise<void> Listen for queue values to be delivered from the database queue, which
were enqueued with Deno.Kv.enqueue. The provided handler
callback is invoked on every dequeued value. A failed callback
invocation is automatically retried multiple times until it succeeds
or until the maximum number of retries is reached.
const db = await Deno.openKv();
db.listenQueue(async (msg: unknown) => {
await db.set(["foo"], msg);
});
#set(): Promise<KvCommitResult> Set the value for the given key in the database. If a value already exists for the key, it will be overwritten.
const db = await Deno.openKv();
await db.set(["foo"], "bar");
Optionally an expireIn option can be specified to set a time-to-live
(TTL) for the key. The TTL is specified in milliseconds, and the key will
be deleted from the database at earliest after the specified number of
milliseconds have elapsed. Once the specified duration has passed, the
key may still be visible for some additional time. If the expireIn
option is not specified, the key will not expire.
#watch<T extends readonly unknown[]>(keys: readonly [...[K in keyof T]: KvKey],options?: { raw?: boolean; },): ReadableStream<[K in keyof T]: KvEntryMaybe<T[K]>> Watch for changes to the given keys in the database. The returned stream
is a ReadableStream that emits a new value whenever any of
the watched keys change their versionstamp. The emitted value is an array
of Deno.KvEntryMaybe objects, with the same length and order
as the keys array. If no value exists for a given key, the returned
entry will have a null value and versionstamp.
The returned stream does not return every single intermediate state of the watched keys, but rather only keeps you up to date with the latest state of the keys. This means that if a key is modified multiple times quickly, you may not receive a notification for every single change, but rather only the latest state of the key.
const db = await Deno.openKv();
const stream = db.watch([["foo"], ["bar"]]);
for await (const entries of stream) {
entries[0].key; // ["foo"]
entries[0].value; // "bar"
entries[0].versionstamp; // "00000000000000010000"
entries[1].key; // ["bar"]
entries[1].value; // null
entries[1].versionstamp; // null
}
The options argument can be used to specify additional options for the
watch operation. The raw option can be used to specify whether a new
value should be emitted whenever a mutation occurs on any of the watched
keys (even if the value of the key does not change, such as deleting a
deleted key), or only when entries have observably changed in some way.
When raw: true is used, it is possible for the stream to occasionally
emit values even if no mutations have occurred on any of the watched
keys. The default value for this option is false.
class Deno.KvU64
function Deno.cron
Overload 1
#cron(): Promise<void>Create a cron job that will periodically execute the provided handler callback based on the specified schedule.
Deno.cron("sample cron", "20 * * * *", () => {
console.log("cron job executed");
});
Deno.cron("sample cron", { hour: { every: 6 } }, () => {
console.log("cron job executed");
});
schedule can be a string in the Unix cron format or in JSON format
as specified by interface CronSchedule, where time is specified
using UTC time zone.
Parameters #
Return Type #
Promise<void> Overload 2
#cron(name: string,schedule: string | CronSchedule,options: { backoffSchedule?: number[]; signal?: AbortSignal; },handler: () => Promise<void> | void,): Promise<void>Create a cron job that will periodically execute the provided handler callback based on the specified schedule.
Deno.cron("sample cron", "20 * * * *", {
backoffSchedule: [10, 20]
}, () => {
console.log("cron job executed");
});
schedule can be a string in the Unix cron format or in JSON format
as specified by interface CronSchedule, where time is specified
using UTC time zone.
backoffSchedule option can be used to specify the retry policy for failed
executions. Each element in the array represents the number of milliseconds
to wait before retrying the execution. For example, [1000, 5000, 10000]
means that a failed execution will be retried at most 3 times, with 1
second, 5 seconds, and 10 seconds delay between each retry. There is a
limit of 5 retries and a maximum interval of 1 hour (3600000 milliseconds).
Parameters #
#name: string #schedule: string | CronSchedule #options: { backoffSchedule?: number[]; signal?: AbortSignal; } #handler: () => Promise<void> | void Return Type #
Promise<void> function Deno.openKv
#openKv(path?: string): Promise<Kv>Open a new Deno.Kv connection to persist data.
When a path is provided, the database will be persisted to disk at that path. Read and write access to the file is required.
When no path is provided, the database will be opened in a default path for
the current script. This location is persistent across script runs and is
keyed on the origin storage key (the same key that is used to determine
localStorage persistence). More information about the origin storage key
can be found in the Deno Manual.
Parameters #
#path: string Return Type #
Promise<Kv> interface Deno.AtomicCheck
A check to perform as part of a Deno.AtomicOperation. The check
will fail if the versionstamp for the key-value pair in the KV store does
not match the given versionstamp. A check with a null versionstamp checks
that the key-value pair does not currently exist in the KV store.
Properties #
#versionstamp: string | null interface Deno.CronSchedule
CronSchedule is the interface used for JSON format
cron schedule.
Properties #
#minute: CronScheduleExpression #hour: CronScheduleExpression #dayOfMonth: CronScheduleExpression #month: CronScheduleExpression #dayOfWeek: CronScheduleExpression interface Deno.KvCommitResult
Properties #
#versionstamp: string The versionstamp of the value committed to KV.
interface Deno.KvEntry
A versioned pair of key and value in a Deno.Kv.
The versionstamp is a string that represents the current version of the
key-value pair. It can be used to perform atomic operations on the KV store
by passing it to the check method of a Deno.AtomicOperation.
Type Parameters #
#T Properties #
interface Deno.KvListOptions
Options for listing key-value pairs in a Deno.Kv.
Properties #
The maximum number of key-value pairs to return. If not specified, all matching key-value pairs will be returned.
The cursor to resume the iteration from. If not specified, the iteration will start from the beginning.
Whether to reverse the order of the returned key-value pairs. If not
specified, the order will be ascending from the start of the range as per
the lexicographical ordering of the keys. If true, the order will be
descending from the end of the range.
The default value is false.
#consistency: KvConsistencyLevel The consistency level of the list operation. The default consistency
level is "strong". Some use cases can benefit from using a weaker
consistency level. For more information on consistency levels, see the
documentation for Deno.KvConsistencyLevel.
List operations are performed in batches (in sizes specified by the
batchSize option). The consistency level of the list operation is
applied to each batch individually. This means that while each batch is
guaranteed to be consistent within itself, the entire list operation may
not be consistent across batches because a mutation may be applied to a
key-value pair between batches, in a batch that has already been returned
by the list operation.
The size of the batches in which the list operation is performed. Larger or smaller batch sizes may positively or negatively affect the performance of a list operation depending on the specific use case and iteration behavior. Slow iterating queries may benefit from using a smaller batch size for increased overall consistency, while fast iterating queries may benefit from using a larger batch size for better performance.
The default batch size is equal to the limit option, or 100 if this is
unset. The maximum value for this option is 500. Larger values will be
clamped.
type alias Deno.CronScheduleExpression
CronScheduleExpression is used as the type of minute, hour,
dayOfMonth, month, and dayOfWeek in CronSchedule.
Definition #
number
| { exact: number | number[]; }
| { start?: number; end?: number; every?: number; } type alias Deno.KvConsistencyLevel
Consistency level of a KV operation.
strong- This operation must be strongly-consistent.eventual- Eventually-consistent behavior is allowed.
Definition #
"strong" | "eventual" type alias Deno.KvEntryMaybe
type alias Deno.KvKey
A key to be persisted in a Deno.Kv. A key is a sequence
of Deno.KvKeyParts.
Keys are ordered lexicographically by their parts. The first part is the
most significant, and the last part is the least significant. The order of
the parts is determined by both the type and the value of the part. The
relative significance of the types can be found in documentation for the
Deno.KvKeyPart type.
Keys have a maximum size of 2048 bytes serialized. If the size of the key exceeds this limit, an error will be thrown on the operation that this key was passed to.
Definition #
readonly KvKeyPart[] type alias Deno.KvKeyPart
A single part of a Deno.KvKey. Parts are ordered
lexicographically, first by their type, and within a given type by their
value.
The ordering of types is as follows:
Uint8Arraystringnumberbigintboolean
Within a given type, the ordering is as follows:
Uint8Arrayis ordered by the byte ordering of the arraystringis ordered by the byte ordering of the UTF-8 encoding of the stringnumberis ordered following this pattern:-NaN<-Infinity<-100.0<-1.0< -0.5<-0.0<0.0<0.5<1.0<100.0<Infinity<NaNbigintis ordered by mathematical ordering, with the largest negative number being the least first value, and the largest positive number being the last valuebooleanis ordered byfalse<true
This means that the part 1.0 (a number) is ordered before the part 2.0
(also a number), but is greater than the part 0n (a bigint), because
1.0 is a number and 0n is a bigint, and type ordering has precedence
over the ordering of values within a type.
Definition #
Uint8Array
| string
| number
| bigint
| boolean
| symbol type alias Deno.KvListSelector
A selector that selects the range of data returned by a list operation on a
Deno.Kv.
The selector can either be a prefix selector or a range selector. A prefix selector selects all keys that start with the given prefix (optionally starting at a given key). A range selector selects all keys that are lexicographically between the given start and end keys.
Definition #
type alias Deno.KvMutation
A mutation to a key in a Deno.Kv. A mutation is a
combination of a key, a value, and a type. The type determines how the
mutation is applied to the key.
set- Sets the value of the key to the given value, overwriting any existing value. Optionally anexpireInoption can be specified to set a time-to-live (TTL) for the key. The TTL is specified in milliseconds, and the key will be deleted from the database at earliest after the specified number of milliseconds have elapsed. Once the specified duration has passed, the key may still be visible for some additional time. If theexpireInoption is not specified, the key will not expire.delete- Deletes the key from the database. The mutation is a no-op if the key does not exist.sum- Adds the given value to the existing value of the key. Both the value specified in the mutation, and any existing value must be of typeDeno.KvU64. If the key does not exist, the value is set to the given value (summed with 0). If the result of the sum overflows an unsigned 64-bit integer, the result is wrapped around.max- Sets the value of the key to the maximum of the existing value and the given value. Both the value specified in the mutation, and any existing value must be of typeDeno.KvU64. If the key does not exist, the value is set to the given value.min- Sets the value of the key to the minimum of the existing value and the given value. Both the value specified in the mutation, and any existing value must be of typeDeno.KvU64. If the key does not exist, the value is set to the given value.