Skip to content

Lint and storage

Terminal window
npm install -D oxlint @durability/lint

Add the plugin to .oxlintrc.json:

{
"jsPlugins": [
{ "name": "durability", "specifier": "@durability/lint" }
],
"rules": {
"durability/alarm-runner-only": "error",
"durability/durability-migrations-only": "error"
}
}

A class using createDurability must delegate its platform alarm directly:

class ImageJobs extends DurableObject<Env> {
private readonly durability = createDurability(this.ctx, handlers);
alarm(info?: AlarmInvocationInfo) {
return this.durability.alarm(info);
}
}

Additional alarm work can replace or delay the one physical alarm Durability owns. Model it as a named alarm instead.

Static CREATE TABLE statements must live in a reversible migration list typed with DurableMigrations:

Terminal window
npm install @durability/storage
import type { DurableMigrations } from '@durability/storage';
export const migrations = [
{
name: '0001_create_jobs',
up: `
CREATE TABLE jobs (
id TEXT PRIMARY KEY,
payload TEXT NOT NULL
);
`,
down: 'DROP TABLE jobs;',
},
] satisfies DurableMigrations;

Each library should use a namespaced migration-history table. The lint rule requires workers-qb DOQB builders to specify one:

const builder = new DOQB(this.ctx.storage.sql).migrations({
migrations,
tableName: 'my_library_migrations',
});

@durability/storage contains the shared migration contract and no scheduler runtime. Use it for application or library migrations even when the main durability package does not own those tables.