Object Storage

Use services.storage for files or larger values that should not inflate durable workflow context.

Typical uses

  • Generated reports and media.
  • Raw imports needed by later steps.
  • Large API responses retained outside step results.
  • Artifacts referenced by several runs.

Storage returns bounded metadata and a durable object reference. Save the reference in context, not the complete body. WOML verifies checksums and keeps object storage separate from the SQLite event authority.

Back up the storage directory together with workflow state when stored objects are required for recovery.

Store an object

JavaScript
const object = await services.storage.put({
  key: `reports/${context.payload.reportId}.json`,
  value: context.steps.buildReport,
  contentType: "application/json"
});

return {
  key: object.key,
  version: object.version,
  checksum: object.checksum
};

Later work can load and verify it:

JavaScript
const loaded = await services.storage.get({
  key: context.steps.saveReport.key,
  responseType: "json",
  ifVersion: context.steps.saveReport.version
});

return loaded.data;

Treat keys as logical names

Keys resemble paths but are not arbitrary filesystem paths. WOML rejects absolute paths, traversal, backslashes, empty segments, control characters, and NUL bytes.

The local object limit is 64 MiB. Use head for metadata, list for bounded key-ordered discovery, and conditional versions for optimistic safety.

Object data is separate from the event database. A useful state backup without its required objects-v1 directory is incomplete, so back up and restore them coherently.