This tool uses UUIDv7s in blob keys with UNIX timestamps included to keep track of when they expire. Since UUIDv7s are sortable and the blob list endpoint returns results alphabetically, cleanup (checking the blob list and deleting any expired keys) is efficient since any expired keys will be at the front of the results!
Each ID is prefixed with a prefix
(default: expireBlob:
) and can be suffixed with a label
(parameter order depends on the method).
Example blob keys:
expiringBlob:01944432-4837-7a99-94e6-e0e162554e21
^Prefix ^UUIDv7
expiringBlob:01944432-4837-7a99-94e6-e0e162554e21:aaaa
^Prefix ^UUIDv7 ^Label
createKey
: generate a key you can use with @std/blob methodsset
orsetJSON
: generate a blob key and save content to it in one stepcleanup
: delete expired blobs. You can run this manually or periodically with a cron val. If using a custom prefix, make sure to pass it to this method so that the correct blob list is searched.
By default, createKey
, set
, and setJSON
will create keys that expire in an hour, but you can override this by passing the expireAt: Date | number
parameter. For convenience, expireIn
is provided with methods to create future dates for each of the following:
expireIn.hours(2)
expireIn.minutes(5)
expireIn.seconds(45)
expireIn.ms(500)
To request data once you've saved it, use @std/blob's get
and getJSON
as usual with the key provided by set
or setJSON
!
import { cleanup, createKey, expireIn, set, setJSON } from "https://esm.town/v/postpostscript/expiringBlob";
import { blob } from "https://esm.town/v/std/blob";
const aaaa = createKey("aaaa"); // equivalent of createKey("aaaa", expireIn.hours(1))
await blob.setJSON(aaaa, {
x: 1,
});
console.log(aaaa, await blob.getJSON(aaaa));
// expiringBlob:01944432-4837-7a99-94e6-e0e162554e21:aaaa { x: 1 }
console.log(await set("bbbb", "test", expireIn.seconds(1)));
// expiringBlob:019443fb-6106-77f2-ab0c-5142b099c81a:bbbb
console.log(await setJSON("cccc", { x: 1 }, expireIn.seconds(1)));
// expiringBlob:019443fb-6327-733c-9a0b-c8b9ee9faef0:cccc
await cleanup();
// [no logs]
await new Promise((resolve) => setTimeout(resolve, 1000));
await cleanup();
// deleting expired blob: expiringBlob:019443fb-6106-77f2-ab0c-5142b099c81a:bbbb
// deleting expired blob: expiringBlob:019443fb-6327-733c-9a0b-c8b9ee9faef0:cccc
Create a cron val with the following code to periodically delete expired blobs:
import { cleanup } from "https://esm.town/v/postpostscript/expiringBlob";
export default () => cleanup();
Migrated from folder: ExpiringBlob/expiringBlob