FeaturesTemplatesShowcaseTownie
AI
BlogDocsPricing
Log inSign up
postpostscript
postpostscriptexpiringBlob
Public
Like
expiringBlob
Home
Code
2
README.md
main.tsx
Branches
1
Pull requests
Remixes
History
Environment variables
Settings
Val Town is a collaborative website to build and scale JavaScript apps.
Deploy APIs, crons, & store data – all from the browser, and deployed in miliseconds.
Sign up now
Code
/
Code
/
Search
README.md

expiringBlob: create-and-forget blobs using UUIDv7

How it Works

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

Methods

  • createKey: generate a key you can use with @std/blob methods
  • set or setJSON: generate a blob key and save content to it in one step
  • cleanup: 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!

Full Example

Create val
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

Forkable Cron Example

Create a cron val with the following code to periodically delete expired blobs:

Create val
import { cleanup } from "https://esm.town/v/postpostscript/expiringBlob"; export default () => cleanup();

Migrated from folder: ExpiringBlob/expiringBlob

Code
README.mdmain.tsx
Go to top
X (Twitter)
Discord community
GitHub discussions
YouTube channel
Bluesky
Product
FeaturesPricing
Developers
DocsStatusAPI ExamplesNPM Package Examples
Explore
ShowcaseTemplatesNewest ValsTrending ValsNewsletter
Company
AboutBlogCareersBrandhi@val.town
Terms of usePrivacy policyAbuse contact
© 2025 Val Town, Inc.