bunderstack 0.23.3 → 0.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/CHANGELOG.md +68 -0
  2. package/README.md +6 -4
  3. package/dist/api/builder.d.ts +13 -11
  4. package/dist/api/builder.d.ts.map +1 -1
  5. package/dist/api/builder.js.map +1 -1
  6. package/dist/api/context.d.ts +6 -6
  7. package/dist/api/context.d.ts.map +1 -1
  8. package/dist/api/context.js +1 -1
  9. package/dist/api/context.js.map +1 -1
  10. package/dist/api/crud-router.d.ts +6 -6
  11. package/dist/api/realtime-router.d.ts +1 -1
  12. package/dist/api/storage-router.d.ts +5 -5
  13. package/dist/backend-internals.d.ts +5 -13
  14. package/dist/backend-internals.d.ts.map +1 -1
  15. package/dist/backend-internals.js.map +1 -1
  16. package/dist/backend.d.ts +39 -5
  17. package/dist/backend.d.ts.map +1 -1
  18. package/dist/backend.js +37 -46
  19. package/dist/backend.js.map +1 -1
  20. package/dist/blueprint-generator.d.ts +1 -0
  21. package/dist/blueprint-generator.d.ts.map +1 -1
  22. package/dist/blueprint-generator.js +29 -1
  23. package/dist/blueprint-generator.js.map +1 -1
  24. package/dist/blueprint.d.ts +2 -1
  25. package/dist/blueprint.d.ts.map +1 -1
  26. package/dist/blueprint.js +9 -2
  27. package/dist/blueprint.js.map +1 -1
  28. package/dist/cli.d.ts.map +1 -1
  29. package/dist/cli.js +14 -2
  30. package/dist/cli.js.map +1 -1
  31. package/dist/config.d.ts +13 -19
  32. package/dist/config.d.ts.map +1 -1
  33. package/dist/config.js +1 -1
  34. package/dist/config.js.map +1 -1
  35. package/dist/email/smtp.d.ts +7 -1
  36. package/dist/email/smtp.d.ts.map +1 -1
  37. package/dist/email/smtp.js +5 -1
  38. package/dist/email/smtp.js.map +1 -1
  39. package/dist/email.d.ts +3 -29
  40. package/dist/email.d.ts.map +1 -1
  41. package/dist/email.js +1 -194
  42. package/dist/email.js.map +1 -1
  43. package/dist/env-probe.d.ts +9 -0
  44. package/dist/env-probe.d.ts.map +1 -0
  45. package/dist/env-probe.js +73 -0
  46. package/dist/env-probe.js.map +1 -0
  47. package/dist/env.d.ts +2 -5
  48. package/dist/env.d.ts.map +1 -1
  49. package/dist/env.js +2 -9
  50. package/dist/env.js.map +1 -1
  51. package/dist/hosted-contract.d.ts +11 -0
  52. package/dist/hosted-contract.d.ts.map +1 -0
  53. package/dist/hosted-contract.js +46 -0
  54. package/dist/hosted-contract.js.map +1 -0
  55. package/dist/index.d.ts +3 -2
  56. package/dist/index.d.ts.map +1 -1
  57. package/dist/index.js +1 -1
  58. package/dist/index.js.map +1 -1
  59. package/dist/inspect.d.ts +15 -0
  60. package/dist/inspect.d.ts.map +1 -0
  61. package/dist/inspect.js +43 -0
  62. package/dist/inspect.js.map +1 -0
  63. package/dist/internal-tables-pg.d.ts +43 -94
  64. package/dist/internal-tables-pg.d.ts.map +1 -1
  65. package/dist/internal-tables-pg.js +15 -17
  66. package/dist/internal-tables-pg.js.map +1 -1
  67. package/dist/internal-tables.d.ts +213 -488
  68. package/dist/internal-tables.d.ts.map +1 -1
  69. package/dist/internal-tables.js +34 -33
  70. package/dist/internal-tables.js.map +1 -1
  71. package/dist/jobs/define.d.ts +20 -20
  72. package/dist/jobs/define.d.ts.map +1 -1
  73. package/dist/jobs/define.js.map +1 -1
  74. package/dist/jobs/worker.d.ts.map +1 -1
  75. package/dist/jobs/worker.js +34 -22
  76. package/dist/jobs/worker.js.map +1 -1
  77. package/dist/manifest-diff.d.ts +6 -0
  78. package/dist/manifest-diff.d.ts.map +1 -0
  79. package/dist/manifest-diff.js +42 -0
  80. package/dist/manifest-diff.js.map +1 -0
  81. package/dist/manifest.d.ts +10 -2
  82. package/dist/manifest.d.ts.map +1 -1
  83. package/dist/manifest.js +27 -29
  84. package/dist/manifest.js.map +1 -1
  85. package/dist/messaging/email.d.ts +16 -0
  86. package/dist/messaging/email.d.ts.map +1 -0
  87. package/dist/messaging/email.js +8 -0
  88. package/dist/messaging/email.js.map +1 -0
  89. package/dist/messaging/index.d.ts +8 -0
  90. package/dist/messaging/index.d.ts.map +1 -0
  91. package/dist/messaging/index.js +4 -0
  92. package/dist/messaging/index.js.map +1 -0
  93. package/dist/messaging/journal.d.ts +4 -0
  94. package/dist/messaging/journal.d.ts.map +1 -0
  95. package/dist/messaging/journal.js +19 -0
  96. package/dist/messaging/journal.js.map +1 -0
  97. package/dist/messaging/runtime.d.ts +16 -0
  98. package/dist/messaging/runtime.d.ts.map +1 -0
  99. package/dist/messaging/runtime.js +213 -0
  100. package/dist/messaging/runtime.js.map +1 -0
  101. package/dist/messaging/standalone.d.ts +27 -0
  102. package/dist/messaging/standalone.d.ts.map +1 -0
  103. package/dist/messaging/standalone.js +18 -0
  104. package/dist/messaging/standalone.js.map +1 -0
  105. package/dist/messaging/telegram.d.ts +16 -0
  106. package/dist/messaging/telegram.d.ts.map +1 -0
  107. package/dist/messaging/telegram.js +5 -0
  108. package/dist/messaging/telegram.js.map +1 -0
  109. package/dist/messaging/types.d.ts +22 -0
  110. package/dist/messaging/types.d.ts.map +1 -0
  111. package/dist/messaging/types.js +17 -0
  112. package/dist/messaging/types.js.map +1 -0
  113. package/dist/runtime.d.ts +11 -10
  114. package/dist/runtime.d.ts.map +1 -1
  115. package/dist/runtime.js +19 -31
  116. package/dist/runtime.js.map +1 -1
  117. package/dist/schema-export-pg.d.ts +1 -1
  118. package/dist/schema-export-pg.d.ts.map +1 -1
  119. package/dist/schema-export-pg.js +1 -1
  120. package/dist/schema-export-pg.js.map +1 -1
  121. package/dist/schema-export.d.ts +1 -1
  122. package/dist/schema-export.d.ts.map +1 -1
  123. package/dist/schema-export.js +1 -1
  124. package/dist/schema-export.js.map +1 -1
  125. package/dist/testing/fixture.d.ts +2 -2
  126. package/dist/testing/fixture.d.ts.map +1 -1
  127. package/dist/testing/fixture.js +11 -9
  128. package/dist/testing/fixture.js.map +1 -1
  129. package/dist/testing/messaging.d.ts +21 -0
  130. package/dist/testing/messaging.d.ts.map +1 -0
  131. package/dist/testing/messaging.js +34 -0
  132. package/dist/testing/messaging.js.map +1 -0
  133. package/dist/testing.d.ts +1 -0
  134. package/dist/testing.d.ts.map +1 -1
  135. package/dist/testing.js.map +1 -1
  136. package/package.json +6 -2
  137. package/skills/creating-bunderstack-apps/references/application-structure.md +16 -7
  138. package/skills/migrating-to-bunderstack/SKILL.md +72 -50
  139. package/skills/migrating-to-bunderstack/references/audit-checklist.md +2 -2
  140. package/skills/migrating-to-bunderstack/references/runtime-replacements.md +16 -12
@@ -1 +1 @@
1
- {"version":3,"file":"internal-tables.d.ts","sourceRoot":"","sources":["../src/internal-tables.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"internal-tables.d.ts","sourceRoot":"","sources":["../src/internal-tables.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@ import { getTableName, is, isTable } from 'drizzle-orm';
2
2
  import { PgDatabase } from 'drizzle-orm/pg-core';
3
3
  import { index, integer, primaryKey, sqliteTable, text, uniqueIndex, } from 'drizzle-orm/sqlite-core';
4
4
  import { detectDialect } from './dialect.js';
5
- import { bunderstackEmailEventsPg, bunderstackEmailsPg, bunderstackFilesPg, bunderstackIdempotencyPg, bunderstackJobsPg, } from './internal-tables-pg.js';
5
+ import { bunderstackFilesPg, bunderstackIdempotencyPg, bunderstackJobsPg, bunderstackMessageEventsPg, bunderstackMessagesPg, } from './internal-tables-pg.js';
6
6
  export const bunderstackFiles = sqliteTable('bunderstack_file_meta', {
7
7
  fileId: text('file_id').primaryKey(),
8
8
  bucket: text('bucket').notNull(),
@@ -42,64 +42,62 @@ export const bunderstackJobs = sqliteTable('_bunderstack_jobs', {
42
42
  }, (t) => [
43
43
  index('bjq_claim').on(t.status, t.runAt),
44
44
  index('bjq_type_status').on(t.type, t.status),
45
+ index('bjq_type_run_at').on(t.type, t.runAt),
45
46
  // NULL dedupe keys are distinct in both dialects, so keyless jobs never collide.
46
47
  uniqueIndex('bjq_dedupe').on(t.type, t.dedupeKey),
47
48
  ]);
48
- export const bunderstackEmails = sqliteTable('_bunderstack_emails', {
49
+ export const bunderstackMessages = sqliteTable('_bunderstack_messages', {
49
50
  id: text('id').primaryKey(),
51
+ channel: text('channel').notNull(),
52
+ kind: text('kind').notNull(),
50
53
  provider: text('provider').notNull(),
54
+ credentialSource: text('credential_source').notNull(),
51
55
  providerId: text('provider_id'),
52
56
  status: text('status').notNull(),
53
- from: text('from_address').notNull(),
54
- toJson: text('to_json').notNull(),
55
- ccJson: text('cc_json').notNull(),
56
- bccJson: text('bcc_json').notNull(),
57
- replyTo: text('reply_to'),
58
- subject: text('subject').notNull(),
59
- html: text('html'),
60
- text: text('text'),
57
+ recipientsJson: text('recipients_json').notNull(),
58
+ contentJson: text('content_json').notNull(),
61
59
  error: text('error'),
62
60
  createdAt: integer('created_at').notNull(),
63
61
  updatedAt: integer('updated_at').notNull(),
64
62
  }, (t) => [
65
- index('bem_created').on(t.createdAt),
66
- index('bem_status').on(t.status, t.createdAt),
67
- uniqueIndex('bem_provider_id').on(t.provider, t.providerId),
63
+ index('bmsg_created').on(t.createdAt),
64
+ index('bmsg_channel_status').on(t.channel, t.status, t.createdAt),
65
+ uniqueIndex('bmsg_provider_id').on(t.provider, t.providerId),
68
66
  ]);
69
- export const bunderstackEmailEvents = sqliteTable('_bunderstack_email_events', {
67
+ export const bunderstackMessageEvents = sqliteTable('_bunderstack_message_events', {
70
68
  id: text('id').primaryKey(),
71
- emailId: text('email_id')
69
+ messageId: text('message_id')
72
70
  .notNull()
73
- .references(() => bunderstackEmails.id, { onDelete: 'cascade' }),
71
+ .references(() => bunderstackMessages.id, { onDelete: 'cascade' }),
74
72
  externalId: text('external_id').notNull(),
75
73
  type: text('type').notNull(),
76
74
  detailJson: text('detail_json'),
77
75
  occurredAt: integer('occurred_at').notNull(),
78
76
  createdAt: integer('created_at').notNull(),
79
77
  }, (t) => [
80
- uniqueIndex('beev_external').on(t.externalId),
81
- index('beev_email_time').on(t.emailId, t.occurredAt),
78
+ uniqueIndex('bmev_external').on(t.externalId),
79
+ index('bmev_message_time').on(t.messageId, t.occurredAt),
82
80
  ]);
83
81
  export const INTERNAL_TABLES = {
84
82
  bunderstackFiles,
85
83
  bunderstackIdempotency,
86
84
  bunderstackJobs,
87
- bunderstackEmails,
88
- bunderstackEmailEvents,
85
+ bunderstackMessages,
86
+ bunderstackMessageEvents,
89
87
  };
90
88
  export const INTERNAL_TABLE_NAMES = new Set([
91
89
  'bunderstack_file_meta',
92
90
  '_bunderstack_idempotency',
93
91
  '_bunderstack_jobs',
94
- '_bunderstack_emails',
95
- '_bunderstack_email_events',
92
+ '_bunderstack_messages',
93
+ '_bunderstack_message_events',
96
94
  ]);
97
95
  export const INTERNAL_TABLES_PG = {
98
96
  bunderstackFiles: bunderstackFilesPg,
99
97
  bunderstackIdempotency: bunderstackIdempotencyPg,
100
98
  bunderstackJobs: bunderstackJobsPg,
101
- bunderstackEmails: bunderstackEmailsPg,
102
- bunderstackEmailEvents: bunderstackEmailEventsPg,
99
+ bunderstackMessages: bunderstackMessagesPg,
100
+ bunderstackMessageEvents: bunderstackMessageEventsPg,
103
101
  };
104
102
  // Both dialect twins count as "ours" for the re-export identity check.
105
103
  const INTERNAL_TABLE_CANDIDATES = new Map([
@@ -109,10 +107,13 @@ const INTERNAL_TABLE_CANDIDATES = new Map([
109
107
  [bunderstackIdempotency, bunderstackIdempotencyPg],
110
108
  ],
111
109
  [getTableName(bunderstackJobs), [bunderstackJobs, bunderstackJobsPg]],
112
- [getTableName(bunderstackEmails), [bunderstackEmails, bunderstackEmailsPg]],
113
110
  [
114
- getTableName(bunderstackEmailEvents),
115
- [bunderstackEmailEvents, bunderstackEmailEventsPg],
111
+ getTableName(bunderstackMessages),
112
+ [bunderstackMessages, bunderstackMessagesPg],
113
+ ],
114
+ [
115
+ getTableName(bunderstackMessageEvents),
116
+ [bunderstackMessageEvents, bunderstackMessageEventsPg],
116
117
  ],
117
118
  ]);
118
119
  /** Internal file-meta table matching the db's dialect. */
@@ -127,13 +128,13 @@ export function idempotencyTableFor(db) {
127
128
  export function jobsTableFor(db) {
128
129
  return is(db, PgDatabase) ? bunderstackJobsPg : bunderstackJobs;
129
130
  }
130
- /** Internal email journal table matching the db's dialect. */
131
- export function emailsTableFor(db) {
132
- return is(db, PgDatabase) ? bunderstackEmailsPg : bunderstackEmails;
131
+ export function messagesTableFor(db) {
132
+ return is(db, PgDatabase) ? bunderstackMessagesPg : bunderstackMessages;
133
133
  }
134
- /** Internal email event table matching the db's dialect. */
135
- export function emailEventsTableFor(db) {
136
- return is(db, PgDatabase) ? bunderstackEmailEventsPg : bunderstackEmailEvents;
134
+ export function messageEventsTableFor(db) {
135
+ return is(db, PgDatabase)
136
+ ? bunderstackMessageEventsPg
137
+ : bunderstackMessageEvents;
137
138
  }
138
139
  export function withInternalTables(schema) {
139
140
  const merged = { ...schema };
@@ -1 +1 @@
1
- {"version":3,"file":"internal-tables.js","sourceRoot":"","sources":["../src/internal-tables.ts"],"names":[],"mappings":"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","sourcesContent":["import { getTableName, is, isTable } from 'drizzle-orm'\nimport { PgDatabase } from 'drizzle-orm/pg-core'\nimport {\n index,\n integer,\n primaryKey,\n sqliteTable,\n text,\n uniqueIndex,\n} from 'drizzle-orm/sqlite-core'\n\nimport { detectDialect } from './dialect'\nimport {\n bunderstackEmailEventsPg,\n bunderstackEmailsPg,\n bunderstackFilesPg,\n bunderstackIdempotencyPg,\n bunderstackJobsPg,\n} from './internal-tables-pg'\n\nexport const bunderstackFiles = sqliteTable(\n 'bunderstack_file_meta',\n {\n fileId: text('file_id').primaryKey(),\n bucket: text('bucket').notNull(),\n ownerId: text('owner_id'),\n scopeJson: text('scope_json'),\n status: text('status').notNull(),\n filename: text('filename'),\n contentType: text('content_type'),\n size: integer('size'),\n createdAt: integer('created_at').notNull(),\n confirmedAt: integer('confirmed_at'),\n },\n (t) => [\n index('bfm_owner').on(t.ownerId),\n index('bfm_scope').on(t.bucket, t.scopeJson),\n index('bfm_sweep').on(t.status, t.createdAt),\n ],\n)\n\nexport const bunderstackIdempotency = sqliteTable(\n '_bunderstack_idempotency',\n {\n key: text('key').notNull(),\n tableName: text('table_name').notNull(),\n bodyHash: text('body_hash').notNull(),\n status: integer('status').notNull(),\n response: text('response').notNull(),\n expiresAt: integer('expires_at').notNull(),\n },\n (t) => [primaryKey({ columns: [t.key, t.tableName] })],\n)\n\nexport const bunderstackJobs = sqliteTable(\n '_bunderstack_jobs',\n {\n id: text('id').primaryKey(),\n type: text('type').notNull(),\n payloadJson: text('payload_json').notNull(),\n status: text('status').notNull(), // pending | running | succeeded | failed\n attempts: integer('attempts').notNull().default(0),\n runAt: integer('run_at').notNull(),\n lockedUntil: integer('locked_until'),\n dedupeKey: text('dedupe_key'),\n lastError: text('last_error'),\n createdAt: integer('created_at').notNull(),\n finishedAt: integer('finished_at'),\n },\n (t) => [\n index('bjq_claim').on(t.status, t.runAt),\n index('bjq_type_status').on(t.type, t.status),\n // NULL dedupe keys are distinct in both dialects, so keyless jobs never collide.\n uniqueIndex('bjq_dedupe').on(t.type, t.dedupeKey),\n ],\n)\n\nexport const bunderstackEmails = sqliteTable(\n '_bunderstack_emails',\n {\n id: text('id').primaryKey(),\n provider: text('provider').notNull(),\n providerId: text('provider_id'),\n status: text('status').notNull(),\n from: text('from_address').notNull(),\n toJson: text('to_json').notNull(),\n ccJson: text('cc_json').notNull(),\n bccJson: text('bcc_json').notNull(),\n replyTo: text('reply_to'),\n subject: text('subject').notNull(),\n html: text('html'),\n text: text('text'),\n error: text('error'),\n createdAt: integer('created_at').notNull(),\n updatedAt: integer('updated_at').notNull(),\n },\n (t) => [\n index('bem_created').on(t.createdAt),\n index('bem_status').on(t.status, t.createdAt),\n uniqueIndex('bem_provider_id').on(t.provider, t.providerId),\n ],\n)\n\nexport const bunderstackEmailEvents = sqliteTable(\n '_bunderstack_email_events',\n {\n id: text('id').primaryKey(),\n emailId: text('email_id')\n .notNull()\n .references(() => bunderstackEmails.id, { onDelete: 'cascade' }),\n externalId: text('external_id').notNull(),\n type: text('type').notNull(),\n detailJson: text('detail_json'),\n occurredAt: integer('occurred_at').notNull(),\n createdAt: integer('created_at').notNull(),\n },\n (t) => [\n uniqueIndex('beev_external').on(t.externalId),\n index('beev_email_time').on(t.emailId, t.occurredAt),\n ],\n)\n\nexport const INTERNAL_TABLES = {\n bunderstackFiles,\n bunderstackIdempotency,\n bunderstackJobs,\n bunderstackEmails,\n bunderstackEmailEvents,\n} as const\n\nexport const INTERNAL_TABLE_NAMES: ReadonlySet<string> = new Set([\n 'bunderstack_file_meta',\n '_bunderstack_idempotency',\n '_bunderstack_jobs',\n '_bunderstack_emails',\n '_bunderstack_email_events',\n])\n\nexport const INTERNAL_TABLES_PG = {\n bunderstackFiles: bunderstackFilesPg,\n bunderstackIdempotency: bunderstackIdempotencyPg,\n bunderstackJobs: bunderstackJobsPg,\n bunderstackEmails: bunderstackEmailsPg,\n bunderstackEmailEvents: bunderstackEmailEventsPg,\n} as const\n\n// Both dialect twins count as \"ours\" for the re-export identity check.\nconst INTERNAL_TABLE_CANDIDATES = new Map<string, readonly unknown[]>([\n [getTableName(bunderstackFiles), [bunderstackFiles, bunderstackFilesPg]],\n [\n getTableName(bunderstackIdempotency),\n [bunderstackIdempotency, bunderstackIdempotencyPg],\n ],\n [getTableName(bunderstackJobs), [bunderstackJobs, bunderstackJobsPg]],\n [getTableName(bunderstackEmails), [bunderstackEmails, bunderstackEmailsPg]],\n [\n getTableName(bunderstackEmailEvents),\n [bunderstackEmailEvents, bunderstackEmailEventsPg],\n ],\n])\n\n/** Internal file-meta table matching the db's dialect. */\nexport function filesTableFor(db: unknown) {\n return is(db, PgDatabase) ? bunderstackFilesPg : bunderstackFiles\n}\n\n/** Internal idempotency table matching the db's dialect. */\nexport function idempotencyTableFor(db: unknown) {\n return is(db, PgDatabase) ? bunderstackIdempotencyPg : bunderstackIdempotency\n}\n\n/** Internal jobs table matching the db's dialect. */\nexport function jobsTableFor(db: unknown) {\n return is(db, PgDatabase) ? bunderstackJobsPg : bunderstackJobs\n}\n\n/** Internal email journal table matching the db's dialect. */\nexport function emailsTableFor(db: unknown) {\n return is(db, PgDatabase) ? bunderstackEmailsPg : bunderstackEmails\n}\n\n/** Internal email event table matching the db's dialect. */\nexport function emailEventsTableFor(db: unknown) {\n return is(db, PgDatabase) ? bunderstackEmailEventsPg : bunderstackEmailEvents\n}\n\nexport function withInternalTables<TSchema extends Record<string, unknown>>(\n schema: TSchema,\n): TSchema & typeof INTERNAL_TABLES {\n const merged = { ...schema } as TSchema & typeof INTERNAL_TABLES\n\n for (const value of Object.values(schema)) {\n if (!isTable(value)) continue\n const name = getTableName(value)\n if (!INTERNAL_TABLE_NAMES.has(name)) continue\n\n const candidates = INTERNAL_TABLE_CANDIDATES.get(name)\n if (candidates?.includes(value)) {\n // Re-exported from bunderstack/schema(-pg) — already in user schema.\n continue\n }\n\n throw new Error(\n `[bunderstack] table name \"${name}\" is reserved by bunderstack`,\n )\n }\n\n const internal =\n detectDialect(schema) === 'pg' ? INTERNAL_TABLES_PG : INTERNAL_TABLES\n for (const [key, table] of Object.entries(internal)) {\n if (!(key in merged)) {\n ;(merged as Record<string, unknown>)[key] = table\n }\n }\n\n return merged\n}\n"]}
1
+ {"version":3,"file":"internal-tables.js","sourceRoot":"","sources":["../src/internal-tables.ts"],"names":[],"mappings":"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","sourcesContent":["import { getTableName, is, isTable } from 'drizzle-orm'\nimport { PgDatabase } from 'drizzle-orm/pg-core'\nimport {\n index,\n integer,\n primaryKey,\n sqliteTable,\n text,\n uniqueIndex,\n} from 'drizzle-orm/sqlite-core'\n\nimport { detectDialect } from './dialect'\nimport {\n bunderstackFilesPg,\n bunderstackIdempotencyPg,\n bunderstackJobsPg,\n bunderstackMessageEventsPg,\n bunderstackMessagesPg,\n} from './internal-tables-pg'\n\nexport const bunderstackFiles = sqliteTable(\n 'bunderstack_file_meta',\n {\n fileId: text('file_id').primaryKey(),\n bucket: text('bucket').notNull(),\n ownerId: text('owner_id'),\n scopeJson: text('scope_json'),\n status: text('status').notNull(),\n filename: text('filename'),\n contentType: text('content_type'),\n size: integer('size'),\n createdAt: integer('created_at').notNull(),\n confirmedAt: integer('confirmed_at'),\n },\n (t) => [\n index('bfm_owner').on(t.ownerId),\n index('bfm_scope').on(t.bucket, t.scopeJson),\n index('bfm_sweep').on(t.status, t.createdAt),\n ],\n)\n\nexport const bunderstackIdempotency = sqliteTable(\n '_bunderstack_idempotency',\n {\n key: text('key').notNull(),\n tableName: text('table_name').notNull(),\n bodyHash: text('body_hash').notNull(),\n status: integer('status').notNull(),\n response: text('response').notNull(),\n expiresAt: integer('expires_at').notNull(),\n },\n (t) => [primaryKey({ columns: [t.key, t.tableName] })],\n)\n\nexport const bunderstackJobs = sqliteTable(\n '_bunderstack_jobs',\n {\n id: text('id').primaryKey(),\n type: text('type').notNull(),\n payloadJson: text('payload_json').notNull(),\n status: text('status').notNull(), // pending | running | succeeded | failed\n attempts: integer('attempts').notNull().default(0),\n runAt: integer('run_at').notNull(),\n lockedUntil: integer('locked_until'),\n dedupeKey: text('dedupe_key'),\n lastError: text('last_error'),\n createdAt: integer('created_at').notNull(),\n finishedAt: integer('finished_at'),\n },\n (t) => [\n index('bjq_claim').on(t.status, t.runAt),\n index('bjq_type_status').on(t.type, t.status),\n index('bjq_type_run_at').on(t.type, t.runAt),\n // NULL dedupe keys are distinct in both dialects, so keyless jobs never collide.\n uniqueIndex('bjq_dedupe').on(t.type, t.dedupeKey),\n ],\n)\n\nexport const bunderstackMessages = sqliteTable(\n '_bunderstack_messages',\n {\n id: text('id').primaryKey(),\n channel: text('channel').notNull(),\n kind: text('kind').notNull(),\n provider: text('provider').notNull(),\n credentialSource: text('credential_source').notNull(),\n providerId: text('provider_id'),\n status: text('status').notNull(),\n recipientsJson: text('recipients_json').notNull(),\n contentJson: text('content_json').notNull(),\n error: text('error'),\n createdAt: integer('created_at').notNull(),\n updatedAt: integer('updated_at').notNull(),\n },\n (t) => [\n index('bmsg_created').on(t.createdAt),\n index('bmsg_channel_status').on(t.channel, t.status, t.createdAt),\n uniqueIndex('bmsg_provider_id').on(t.provider, t.providerId),\n ],\n)\n\nexport const bunderstackMessageEvents = sqliteTable(\n '_bunderstack_message_events',\n {\n id: text('id').primaryKey(),\n messageId: text('message_id')\n .notNull()\n .references(() => bunderstackMessages.id, { onDelete: 'cascade' }),\n externalId: text('external_id').notNull(),\n type: text('type').notNull(),\n detailJson: text('detail_json'),\n occurredAt: integer('occurred_at').notNull(),\n createdAt: integer('created_at').notNull(),\n },\n (t) => [\n uniqueIndex('bmev_external').on(t.externalId),\n index('bmev_message_time').on(t.messageId, t.occurredAt),\n ],\n)\n\nexport const INTERNAL_TABLES = {\n bunderstackFiles,\n bunderstackIdempotency,\n bunderstackJobs,\n bunderstackMessages,\n bunderstackMessageEvents,\n} as const\n\nexport const INTERNAL_TABLE_NAMES: ReadonlySet<string> = new Set([\n 'bunderstack_file_meta',\n '_bunderstack_idempotency',\n '_bunderstack_jobs',\n '_bunderstack_messages',\n '_bunderstack_message_events',\n])\n\nexport const INTERNAL_TABLES_PG = {\n bunderstackFiles: bunderstackFilesPg,\n bunderstackIdempotency: bunderstackIdempotencyPg,\n bunderstackJobs: bunderstackJobsPg,\n bunderstackMessages: bunderstackMessagesPg,\n bunderstackMessageEvents: bunderstackMessageEventsPg,\n} as const\n\n// Both dialect twins count as \"ours\" for the re-export identity check.\nconst INTERNAL_TABLE_CANDIDATES = new Map<string, readonly unknown[]>([\n [getTableName(bunderstackFiles), [bunderstackFiles, bunderstackFilesPg]],\n [\n getTableName(bunderstackIdempotency),\n [bunderstackIdempotency, bunderstackIdempotencyPg],\n ],\n [getTableName(bunderstackJobs), [bunderstackJobs, bunderstackJobsPg]],\n [\n getTableName(bunderstackMessages),\n [bunderstackMessages, bunderstackMessagesPg],\n ],\n [\n getTableName(bunderstackMessageEvents),\n [bunderstackMessageEvents, bunderstackMessageEventsPg],\n ],\n])\n\n/** Internal file-meta table matching the db's dialect. */\nexport function filesTableFor(db: unknown) {\n return is(db, PgDatabase) ? bunderstackFilesPg : bunderstackFiles\n}\n\n/** Internal idempotency table matching the db's dialect. */\nexport function idempotencyTableFor(db: unknown) {\n return is(db, PgDatabase) ? bunderstackIdempotencyPg : bunderstackIdempotency\n}\n\n/** Internal jobs table matching the db's dialect. */\nexport function jobsTableFor(db: unknown) {\n return is(db, PgDatabase) ? bunderstackJobsPg : bunderstackJobs\n}\n\nexport function messagesTableFor(db: unknown) {\n return is(db, PgDatabase) ? bunderstackMessagesPg : bunderstackMessages\n}\n\nexport function messageEventsTableFor(db: unknown) {\n return is(db, PgDatabase)\n ? bunderstackMessageEventsPg\n : bunderstackMessageEvents\n}\n\nexport function withInternalTables<TSchema extends Record<string, unknown>>(\n schema: TSchema,\n): TSchema & typeof INTERNAL_TABLES {\n const merged = { ...schema } as TSchema & typeof INTERNAL_TABLES\n\n for (const value of Object.values(schema)) {\n if (!isTable(value)) continue\n const name = getTableName(value)\n if (!INTERNAL_TABLE_NAMES.has(name)) continue\n\n const candidates = INTERNAL_TABLE_CANDIDATES.get(name)\n if (candidates?.includes(value)) {\n // Re-exported from bunderstack/schema(-pg) — already in user schema.\n continue\n }\n\n throw new Error(\n `[bunderstack] table name \"${name}\" is reserved by bunderstack`,\n )\n }\n\n const internal =\n detectDialect(schema) === 'pg' ? INTERNAL_TABLES_PG : INTERNAL_TABLES\n for (const [key, table] of Object.entries(internal)) {\n if (!(key in merged)) {\n ;(merged as Record<string, unknown>)[key] = table\n }\n }\n\n return merged\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import type { StandardSchemaV1 } from '@standard-schema/spec';
2
2
  import type { DbFor } from '../db.js';
3
- import type { EmailFacade } from '../email.js';
3
+ import type { MessagingConfig, MessagingFacadesFor } from '../messaging/index.js';
4
4
  import type { StorageFacade } from '../runtime.js';
5
5
  import { type CatchUp } from './slots.js';
6
6
  export declare const DEFAULT_RETRIES = 3;
@@ -44,18 +44,18 @@ export type JobsRuntimeFacade = {
44
44
  tick(now?: number): Promise<TickResult>;
45
45
  };
46
46
  import type { RealtimeFacade } from '../realtime/facade.js';
47
- export type JobContext<TSchema extends Record<string, unknown> = Record<string, unknown>, TEnvResult = Record<string, unknown>> = {
47
+ export type JobContext<TSchema extends Record<string, unknown> = Record<string, unknown>, TEnvResult = Record<string, unknown>, TMessaging extends MessagingConfig | undefined = MessagingConfig> = {
48
48
  db: DbFor<TSchema>;
49
49
  env: TEnvResult;
50
- email: EmailFacade;
50
+ messaging: MessagingFacadesFor<TMessaging>;
51
51
  storage: StorageFacade;
52
52
  jobs: JobsRuntimeFacade;
53
53
  realtime: RealtimeFacade<TSchema>;
54
54
  /** Aborted when execution reaches its deadline or the job loses its lease. */
55
55
  signal: AbortSignal;
56
56
  };
57
- export type BunderstackJobContext<TSchema extends Record<string, unknown> = Record<string, unknown>, TEnvResult = Record<string, unknown>> = JobContext<TSchema, TEnvResult>;
58
- export type QueueJobDefinition<TInput, TSchema extends Record<string, unknown> = Record<string, unknown>, TEnvResult = Record<string, unknown>> = BackgroundTiming & {
57
+ export type BunderstackJobContext<TSchema extends Record<string, unknown> = Record<string, unknown>, TEnvResult = Record<string, unknown>, TMessaging extends MessagingConfig | undefined = MessagingConfig> = JobContext<TSchema, TEnvResult, TMessaging>;
58
+ export type QueueJobDefinition<TInput, TSchema extends Record<string, unknown> = Record<string, unknown>, TEnvResult = Record<string, unknown>, TMessaging extends MessagingConfig | undefined = MessagingConfig> = BackgroundTiming & {
59
59
  kind: 'job';
60
60
  /** Standard Schema payload; parsed at enqueue AND before the handler runs. */
61
61
  input?: StandardSchemaV1<unknown, TInput>;
@@ -68,14 +68,14 @@ export type QueueJobDefinition<TInput, TSchema extends Record<string, unknown> =
68
68
  };
69
69
  /** Max simultaneous `running` rows of this type, enforced per worker. */
70
70
  concurrency?: number;
71
- handler: (input: TInput, ctx: JobContext<TSchema, TEnvResult>) => Promise<void> | void;
71
+ handler: (input: TInput, ctx: JobContext<TSchema, TEnvResult, TMessaging>) => Promise<void> | void;
72
72
  /** Fires once, after the final attempt fails. Errors here are logged, never retried. */
73
- onFailed?: (input: TInput, error: Error, ctx: JobContext<TSchema, TEnvResult>) => Promise<void> | void;
73
+ onFailed?: (input: TInput, error: Error, ctx: JobContext<TSchema, TEnvResult, TMessaging>) => Promise<void> | void;
74
74
  };
75
75
  export type CronInvocation = {
76
76
  scheduledFor: Date;
77
77
  };
78
- export type CronDefinition<TSchema extends Record<string, unknown> = Record<string, unknown>, TEnvResult = Record<string, unknown>, TSchedule extends string = string> = BackgroundTiming & {
78
+ export type CronDefinition<TSchema extends Record<string, unknown> = Record<string, unknown>, TEnvResult = Record<string, unknown>, TSchedule extends string = string, TMessaging extends MessagingConfig | undefined = MessagingConfig> = BackgroundTiming & {
79
79
  kind: 'cron';
80
80
  schedule: TSchedule;
81
81
  /** Attempts after the first failure. Default 3 (so 4 total attempts). */
@@ -89,19 +89,19 @@ export type CronDefinition<TSchema extends Record<string, unknown> = Record<stri
89
89
  catchUp?: CatchUp;
90
90
  /** How far back catch-up looks, in ms. Default 1 hour. */
91
91
  catchUpWindow?: number;
92
- handler: (invocation: CronInvocation, ctx: JobContext<TSchema, TEnvResult>) => Promise<void> | void;
92
+ handler: (invocation: CronInvocation, ctx: JobContext<TSchema, TEnvResult, TMessaging>) => Promise<void> | void;
93
93
  /** Fires once, after the final attempt fails. Errors here are logged, never retried. */
94
- onFailed?: (invocation: CronInvocation, error: Error, ctx: JobContext<TSchema, TEnvResult>) => Promise<void> | void;
94
+ onFailed?: (invocation: CronInvocation, error: Error, ctx: JobContext<TSchema, TEnvResult, TMessaging>) => Promise<void> | void;
95
95
  };
96
- export type BackgroundDefinition = QueueJobDefinition<any, any, any> | CronDefinition<any, any>;
96
+ export type BackgroundDefinition = QueueJobDefinition<any, any, any, any> | CronDefinition<any, any, any, any>;
97
97
  export type BackgroundDefs = Record<string, BackgroundDefinition>;
98
98
  /** @deprecated Use QueueJobDefinition. */
99
- export type JobDefinition<TInput, TSchema extends Record<string, unknown> = Record<string, unknown>, TEnvResult = Record<string, unknown>> = QueueJobDefinition<TInput, TSchema, TEnvResult>;
100
- export type AnyJobDefinition = QueueJobDefinition<any, any, any>;
101
- export type AnyBackgroundDefinition = QueueJobDefinition<any, any, any> | CronDefinition<any, any, any>;
99
+ export type JobDefinition<TInput, TSchema extends Record<string, unknown> = Record<string, unknown>, TEnvResult = Record<string, unknown>, TMessaging extends MessagingConfig | undefined = MessagingConfig> = QueueJobDefinition<TInput, TSchema, TEnvResult, TMessaging>;
100
+ export type AnyJobDefinition = QueueJobDefinition<any, any, any, any>;
101
+ export type AnyBackgroundDefinition = QueueJobDefinition<any, any, any, any> | CronDefinition<any, any, any, any>;
102
102
  export type JobsDefs = BackgroundDefs;
103
103
  export type QueueJobKeys<TDefs extends BackgroundDefs> = {
104
- [K in keyof TDefs & string]: TDefs[K] extends QueueJobDefinition<any, any, any> ? K : never;
104
+ [K in keyof TDefs & string]: TDefs[K] extends QueueJobDefinition<any, any, any, any> ? K : never;
105
105
  }[keyof TDefs & string];
106
106
  /** Throws when a definition is unusable. Safe to call more than once. */
107
107
  export declare function validateBackgroundDefs(defs: BackgroundDefs): void;
@@ -117,16 +117,16 @@ export declare function backoffMs(def: AnyBackgroundDefinition, attempt: number)
117
117
  * Build the `j` instance bunderstack hands to the config's `jobs` builder
118
118
  * callback (and exports for multi-file job setups).
119
119
  */
120
- export declare function createJobsBuilder<TSchema extends Record<string, unknown>, TEnvResult = Record<string, unknown>>(): {
120
+ export declare function createJobsBuilder<TSchema extends Record<string, unknown>, TEnvResult = Record<string, unknown>, TMessaging extends MessagingConfig | undefined = MessagingConfig>(): {
121
121
  /** Identity with inference: pins TInput from the schema output. */
122
- job<TInput = undefined>(def: Omit<QueueJobDefinition<TInput, TSchema, TEnvResult>, "kind">): QueueJobDefinition<TInput, TSchema, TEnvResult>;
123
- cron<const TSchedule extends string>(def: Omit<CronDefinition<TSchema, TEnvResult, TSchedule>, "kind">): CronDefinition<TSchema, TEnvResult, TSchedule>;
122
+ job<TInput = undefined>(def: Omit<QueueJobDefinition<TInput, TSchema, TEnvResult, TMessaging>, "kind">): QueueJobDefinition<TInput, TSchema, TEnvResult, TMessaging>;
123
+ cron<const TSchedule extends string>(def: Omit<CronDefinition<TSchema, TEnvResult, TSchedule, TMessaging>, "kind">): CronDefinition<TSchema, TEnvResult, TSchedule, TMessaging>;
124
124
  /** Identity with validation: returns the defs map, typed. */
125
125
  define<TDefs extends BackgroundDefs>(defs: TDefs): TDefs;
126
126
  };
127
127
  /** Type of the `j` instance — for builder callbacks declared in separate files. */
128
- export type BunderstackJobsBuilder<TSchema extends Record<string, unknown>, TEnvResult = Record<string, unknown>> = ReturnType<typeof createJobsBuilder<TSchema, TEnvResult>>;
129
- type JobInputOf<TDef> = TDef extends QueueJobDefinition<infer TInput, any, any> ? TInput : undefined;
128
+ export type BunderstackJobsBuilder<TSchema extends Record<string, unknown>, TEnvResult = Record<string, unknown>, TMessaging extends MessagingConfig | undefined = MessagingConfig> = ReturnType<typeof createJobsBuilder<TSchema, TEnvResult, TMessaging>>;
129
+ type JobInputOf<TDef> = TDef extends QueueJobDefinition<infer TInput, any, any, any> ? TInput : undefined;
130
130
  /**
131
131
  * `app.jobs`: `enqueue` narrowed to declared names + payloads. `Omit`s the
132
132
  * runtime facade's loose `enqueue` first — intersecting two same-named
@@ -1 +1 @@
1
- {"version":3,"file":"define.d.ts","sourceRoot":"","sources":["../../src/jobs/define.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"define.d.ts","sourceRoot":"","sources":["../../src/jobs/define.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"define.js","sourceRoot":"","sources":["../../src/jobs/define.ts"],"names":[],"mappings":"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","sourcesContent":["// src/jobs/define.ts — job definition types and the typed builder.\n// `createJobsBuilder` exists purely to carry\n// TSchema/TEnvResult typing into inline callbacks and extracted files.\nimport type { StandardSchemaV1 } from '@standard-schema/spec'\n\nimport type { DbFor } from '../db'\nimport type { EmailFacade } from '../email'\nimport type { StorageFacade } from '../runtime'\n\nimport { parseCron } from './cron'\nimport { CRON_PREFIX, type CatchUp } from './slots'\n\nexport const DEFAULT_RETRIES = 3\nexport const DEFAULT_LEASE_DURATION_MS = 60_000\n/** @deprecated Use DEFAULT_LEASE_DURATION_MS. */\nexport const DEFAULT_TIMEOUT_MS = DEFAULT_LEASE_DURATION_MS\n\nexport type BackgroundTiming = {\n /** Lease duration in ms; an expired lease sends the job back to pending. */\n leaseDuration?: number\n /** Optional cooperative execution deadline in ms. */\n maxRuntime?: number\n /** @deprecated Use leaseDuration. */\n timeout?: number\n}\n\nexport function leaseDurationFor<T extends BackgroundTiming>(def: T): number {\n return def.leaseDuration ?? def.timeout ?? DEFAULT_LEASE_DURATION_MS\n}\n\nexport type EnqueueOptions = {\n /** Collapse duplicate enqueues while the queue row is non-terminal. */\n dedupeKey?: string\n /** Milliseconds from now until the job becomes claimable. */\n delay?: number\n /** Absolute time the job becomes claimable; wins over `delay`. */\n runAt?: Date | number\n}\n\nexport type TickResult = {\n /** Rows moved from pending to running this tick. */\n claimed: number\n /** Handlers that completed successfully. */\n ran: number\n /** Handlers that threw, whether or not they will be retried. */\n failed: number\n}\n\n/**\n * The untyped runtime facade. Job handlers and API context expose this shape;\n * `app.jobs` narrows `enqueue` to the declared job names/payloads.\n */\nexport type JobsRuntimeFacade = {\n enqueue(\n name: string,\n input?: unknown,\n opts?: EnqueueOptions,\n ): Promise<{ id: string }>\n /** Run one poll cycle deterministically (tests). `now` defaults to Date.now(). */\n tick(now?: number): Promise<TickResult>\n}\n\nimport type { RealtimeFacade } from '../realtime/facade'\n\nexport type JobContext<\n TSchema extends Record<string, unknown> = Record<string, unknown>,\n TEnvResult = Record<string, unknown>,\n> = {\n db: DbFor<TSchema>\n env: TEnvResult\n email: EmailFacade\n storage: StorageFacade\n jobs: JobsRuntimeFacade\n realtime: RealtimeFacade<TSchema>\n /** Aborted when execution reaches its deadline or the job loses its lease. */\n signal: AbortSignal\n}\n\nexport type BunderstackJobContext<\n TSchema extends Record<string, unknown> = Record<string, unknown>,\n TEnvResult = Record<string, unknown>,\n> = JobContext<TSchema, TEnvResult>\n\nexport type QueueJobDefinition<\n TInput,\n TSchema extends Record<string, unknown> = Record<string, unknown>,\n TEnvResult = Record<string, unknown>,\n> = BackgroundTiming & {\n kind: 'job'\n /** Standard Schema payload; parsed at enqueue AND before the handler runs. */\n input?: StandardSchemaV1<unknown, TInput>\n /** Attempts after the first failure. Default 3 (so 4 total attempts). */\n retries?: number\n /** Delay before retry N (1-based). Default exponential: 1s, 2s, 4s, … */\n backoff?: ((attempt: number) => number) | { baseMs?: number; factor?: number }\n /** Max simultaneous `running` rows of this type, enforced per worker. */\n concurrency?: number\n handler: (\n input: TInput,\n ctx: JobContext<TSchema, TEnvResult>,\n ) => Promise<void> | void\n /** Fires once, after the final attempt fails. Errors here are logged, never retried. */\n onFailed?: (\n input: TInput,\n error: Error,\n ctx: JobContext<TSchema, TEnvResult>,\n ) => Promise<void> | void\n}\n\nexport type CronInvocation = { scheduledFor: Date }\n\nexport type CronDefinition<\n TSchema extends Record<string, unknown> = Record<string, unknown>,\n TEnvResult = Record<string, unknown>,\n TSchedule extends string = string,\n> = BackgroundTiming & {\n kind: 'cron'\n schedule: TSchedule\n /** Attempts after the first failure. Default 3 (so 4 total attempts). */\n retries?: number\n /** Delay before retry N (1-based). Default exponential: 1s, 2s, 4s, … */\n backoff?: ((attempt: number) => number) | { baseMs?: number; factor?: number }\n /** How missed slots are handled on wake. Default 'latest'. */\n catchUp?: CatchUp\n /** How far back catch-up looks, in ms. Default 1 hour. */\n catchUpWindow?: number\n handler: (\n invocation: CronInvocation,\n ctx: JobContext<TSchema, TEnvResult>,\n ) => Promise<void> | void\n /** Fires once, after the final attempt fails. Errors here are logged, never retried. */\n onFailed?: (\n invocation: CronInvocation,\n error: Error,\n ctx: JobContext<TSchema, TEnvResult>,\n ) => Promise<void> | void\n}\n\nexport type BackgroundDefinition =\n | QueueJobDefinition<any, any, any>\n | CronDefinition<any, any>\nexport type BackgroundDefs = Record<string, BackgroundDefinition>\n\n/** @deprecated Use QueueJobDefinition. */\nexport type JobDefinition<\n TInput,\n TSchema extends Record<string, unknown> = Record<string, unknown>,\n TEnvResult = Record<string, unknown>,\n> = QueueJobDefinition<TInput, TSchema, TEnvResult>\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyJobDefinition = QueueJobDefinition<any, any, any>\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyBackgroundDefinition =\n | QueueJobDefinition<any, any, any>\n | CronDefinition<any, any, any>\nexport type JobsDefs = BackgroundDefs\n\nexport type QueueJobKeys<TDefs extends BackgroundDefs> = {\n [K in keyof TDefs & string]: TDefs[K] extends QueueJobDefinition<\n any,\n any,\n any\n >\n ? K\n : never\n}[keyof TDefs & string]\n\n/** Throws when a definition is unusable. Safe to call more than once. */\nexport function validateBackgroundDefs(defs: BackgroundDefs): void {\n for (const [name, def] of Object.entries(defs)) {\n if (typeof def.handler !== 'function') {\n throw new Error(`[bunderstack] background task \"${name}\" has no handler`)\n }\n if (def.kind === 'job' && name.startsWith(CRON_PREFIX)) {\n throw new Error(\n `[bunderstack] job \"${name}\": the \"${CRON_PREFIX}\" prefix is reserved for cron tasks`,\n )\n }\n if (\n def.retries !== undefined &&\n (def.retries < 0 || !Number.isInteger(def.retries))\n ) {\n throw new Error(\n `[bunderstack] background task \"${name}\": retries must be a non-negative integer`,\n )\n }\n if (def.timeout !== undefined && def.leaseDuration !== undefined) {\n throw new Error(\n `[bunderstack] background task \"${name}\": timeout and leaseDuration cannot both be declared`,\n )\n }\n for (const field of ['timeout', 'leaseDuration', 'maxRuntime'] as const) {\n const value = def[field]\n if (\n value !== undefined &&\n (!Number.isFinite(value) || !Number.isInteger(value) || value <= 0)\n ) {\n throw new Error(\n `[bunderstack] background task \"${name}\": ${field} must be a positive finite integer`,\n )\n }\n }\n if (def.kind === 'cron') {\n parseCron(def.schedule)\n if ((def as { concurrency?: number }).concurrency !== undefined) {\n throw new Error(\n `[bunderstack] cron \"${name}\": concurrency is not supported for cron tasks — slots are already unique`,\n )\n }\n if (def.catchUpWindow !== undefined && def.catchUpWindow <= 0) {\n throw new Error(\n `[bunderstack] cron \"${name}\": catchUpWindow must be positive`,\n )\n }\n continue\n }\n if (\n def.concurrency !== undefined &&\n (def.concurrency < 1 || !Number.isInteger(def.concurrency))\n ) {\n throw new Error(\n `[bunderstack] job \"${name}\": concurrency must be a positive integer`,\n )\n }\n }\n}\n\n/** @deprecated Use validateBackgroundDefs. */\nexport const validateJobsDefs = validateBackgroundDefs\n\n/**\n * Delay in ms before retry `attempt` (1-based = the attempt that just failed).\n * Jittered by ±20% so a shared outage does not retry every job in lockstep.\n * A caller-supplied backoff function is returned verbatim — the caller owns it.\n */\nexport function backoffMs(\n def: AnyBackgroundDefinition,\n attempt: number,\n): number {\n const b = def.backoff\n if (typeof b === 'function') return b(attempt)\n const baseMs = b?.baseMs ?? 1000\n const factor = b?.factor ?? 2\n const flat = baseMs * factor ** (attempt - 1)\n return Math.round(flat * (0.8 + Math.random() * 0.4))\n}\n\n/**\n * Build the `j` instance bunderstack hands to the config's `jobs` builder\n * callback (and exports for multi-file job setups).\n */\nexport function createJobsBuilder<\n TSchema extends Record<string, unknown>,\n TEnvResult = Record<string, unknown>,\n>() {\n return {\n /** Identity with inference: pins TInput from the schema output. */\n job<TInput = undefined>(\n def: Omit<QueueJobDefinition<TInput, TSchema, TEnvResult>, 'kind'>,\n ): QueueJobDefinition<TInput, TSchema, TEnvResult> {\n return { kind: 'job', ...def }\n },\n cron<const TSchedule extends string>(\n def: Omit<CronDefinition<TSchema, TEnvResult, TSchedule>, 'kind'>,\n ): CronDefinition<TSchema, TEnvResult, TSchedule> {\n parseCron(def.schedule)\n return { kind: 'cron', ...def }\n },\n /** Identity with validation: returns the defs map, typed. */\n define<TDefs extends BackgroundDefs>(defs: TDefs): TDefs {\n validateBackgroundDefs(defs)\n return defs\n },\n }\n}\n\n/** Type of the `j` instance — for builder callbacks declared in separate files. */\nexport type BunderstackJobsBuilder<\n TSchema extends Record<string, unknown>,\n TEnvResult = Record<string, unknown>,\n> = ReturnType<typeof createJobsBuilder<TSchema, TEnvResult>>\n\n// Infers TInput from the JobDefinition's own type argument rather than\n// pattern-matching the (optional, so union-with-undefined) `input` property —\n// A required-property pattern fails structurally because `input` is optional,\n// so infer from the definition's own type argument instead.\ntype JobInputOf<TDef> =\n TDef extends QueueJobDefinition<infer TInput, any, any> ? TInput : undefined\n\n/**\n * `app.jobs`: `enqueue` narrowed to declared names + payloads. `Omit`s the\n * runtime facade's loose `enqueue` first — intersecting two same-named\n * methods instead would make TS treat them as overloaded, so the loose\n * `(name: string, ...)` signature would still accept any name.\n */\nexport type JobsFacade<TDefs extends JobsDefs> = Omit<\n JobsRuntimeFacade,\n 'enqueue'\n> & {\n enqueue<K extends QueueJobKeys<TDefs>>(\n name: K,\n ...rest: JobInputOf<TDefs[K]> extends undefined\n ? [input?: undefined, opts?: EnqueueOptions]\n : [input: JobInputOf<TDefs[K]>, opts?: EnqueueOptions]\n ): Promise<{ id: string }>\n}\n"]}
1
+ {"version":3,"file":"define.js","sourceRoot":"","sources":["../../src/jobs/define.ts"],"names":[],"mappings":"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","sourcesContent":["// src/jobs/define.ts — job definition types and the typed builder.\n// `createJobsBuilder` exists purely to carry\n// TSchema/TEnvResult typing into inline callbacks and extracted files.\nimport type { StandardSchemaV1 } from '@standard-schema/spec'\n\nimport type { DbFor } from '../db'\nimport type { MessagingConfig, MessagingFacadesFor } from '../messaging'\nimport type { StorageFacade } from '../runtime'\n\nimport { parseCron } from './cron'\nimport { CRON_PREFIX, type CatchUp } from './slots'\n\nexport const DEFAULT_RETRIES = 3\nexport const DEFAULT_LEASE_DURATION_MS = 60_000\n/** @deprecated Use DEFAULT_LEASE_DURATION_MS. */\nexport const DEFAULT_TIMEOUT_MS = DEFAULT_LEASE_DURATION_MS\n\nexport type BackgroundTiming = {\n /** Lease duration in ms; an expired lease sends the job back to pending. */\n leaseDuration?: number\n /** Optional cooperative execution deadline in ms. */\n maxRuntime?: number\n /** @deprecated Use leaseDuration. */\n timeout?: number\n}\n\nexport function leaseDurationFor<T extends BackgroundTiming>(def: T): number {\n return def.leaseDuration ?? def.timeout ?? DEFAULT_LEASE_DURATION_MS\n}\n\nexport type EnqueueOptions = {\n /** Collapse duplicate enqueues while the queue row is non-terminal. */\n dedupeKey?: string\n /** Milliseconds from now until the job becomes claimable. */\n delay?: number\n /** Absolute time the job becomes claimable; wins over `delay`. */\n runAt?: Date | number\n}\n\nexport type TickResult = {\n /** Rows moved from pending to running this tick. */\n claimed: number\n /** Handlers that completed successfully. */\n ran: number\n /** Handlers that threw, whether or not they will be retried. */\n failed: number\n}\n\n/**\n * The untyped runtime facade. Job handlers and API context expose this shape;\n * `app.jobs` narrows `enqueue` to the declared job names/payloads.\n */\nexport type JobsRuntimeFacade = {\n enqueue(\n name: string,\n input?: unknown,\n opts?: EnqueueOptions,\n ): Promise<{ id: string }>\n /** Run one poll cycle deterministically (tests). `now` defaults to Date.now(). */\n tick(now?: number): Promise<TickResult>\n}\n\nimport type { RealtimeFacade } from '../realtime/facade'\n\nexport type JobContext<\n TSchema extends Record<string, unknown> = Record<string, unknown>,\n TEnvResult = Record<string, unknown>,\n TMessaging extends MessagingConfig | undefined = MessagingConfig,\n> = {\n db: DbFor<TSchema>\n env: TEnvResult\n messaging: MessagingFacadesFor<TMessaging>\n storage: StorageFacade\n jobs: JobsRuntimeFacade\n realtime: RealtimeFacade<TSchema>\n /** Aborted when execution reaches its deadline or the job loses its lease. */\n signal: AbortSignal\n}\n\nexport type BunderstackJobContext<\n TSchema extends Record<string, unknown> = Record<string, unknown>,\n TEnvResult = Record<string, unknown>,\n TMessaging extends MessagingConfig | undefined = MessagingConfig,\n> = JobContext<TSchema, TEnvResult, TMessaging>\n\nexport type QueueJobDefinition<\n TInput,\n TSchema extends Record<string, unknown> = Record<string, unknown>,\n TEnvResult = Record<string, unknown>,\n TMessaging extends MessagingConfig | undefined = MessagingConfig,\n> = BackgroundTiming & {\n kind: 'job'\n /** Standard Schema payload; parsed at enqueue AND before the handler runs. */\n input?: StandardSchemaV1<unknown, TInput>\n /** Attempts after the first failure. Default 3 (so 4 total attempts). */\n retries?: number\n /** Delay before retry N (1-based). Default exponential: 1s, 2s, 4s, … */\n backoff?: ((attempt: number) => number) | { baseMs?: number; factor?: number }\n /** Max simultaneous `running` rows of this type, enforced per worker. */\n concurrency?: number\n handler: (\n input: TInput,\n ctx: JobContext<TSchema, TEnvResult, TMessaging>,\n ) => Promise<void> | void\n /** Fires once, after the final attempt fails. Errors here are logged, never retried. */\n onFailed?: (\n input: TInput,\n error: Error,\n ctx: JobContext<TSchema, TEnvResult, TMessaging>,\n ) => Promise<void> | void\n}\n\nexport type CronInvocation = { scheduledFor: Date }\n\nexport type CronDefinition<\n TSchema extends Record<string, unknown> = Record<string, unknown>,\n TEnvResult = Record<string, unknown>,\n TSchedule extends string = string,\n TMessaging extends MessagingConfig | undefined = MessagingConfig,\n> = BackgroundTiming & {\n kind: 'cron'\n schedule: TSchedule\n /** Attempts after the first failure. Default 3 (so 4 total attempts). */\n retries?: number\n /** Delay before retry N (1-based). Default exponential: 1s, 2s, 4s, … */\n backoff?: ((attempt: number) => number) | { baseMs?: number; factor?: number }\n /** How missed slots are handled on wake. Default 'latest'. */\n catchUp?: CatchUp\n /** How far back catch-up looks, in ms. Default 1 hour. */\n catchUpWindow?: number\n handler: (\n invocation: CronInvocation,\n ctx: JobContext<TSchema, TEnvResult, TMessaging>,\n ) => Promise<void> | void\n /** Fires once, after the final attempt fails. Errors here are logged, never retried. */\n onFailed?: (\n invocation: CronInvocation,\n error: Error,\n ctx: JobContext<TSchema, TEnvResult, TMessaging>,\n ) => Promise<void> | void\n}\n\nexport type BackgroundDefinition =\n | QueueJobDefinition<any, any, any, any>\n | CronDefinition<any, any, any, any>\nexport type BackgroundDefs = Record<string, BackgroundDefinition>\n\n/** @deprecated Use QueueJobDefinition. */\nexport type JobDefinition<\n TInput,\n TSchema extends Record<string, unknown> = Record<string, unknown>,\n TEnvResult = Record<string, unknown>,\n TMessaging extends MessagingConfig | undefined = MessagingConfig,\n> = QueueJobDefinition<TInput, TSchema, TEnvResult, TMessaging>\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyJobDefinition = QueueJobDefinition<any, any, any, any>\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyBackgroundDefinition =\n | QueueJobDefinition<any, any, any, any>\n | CronDefinition<any, any, any, any>\nexport type JobsDefs = BackgroundDefs\n\nexport type QueueJobKeys<TDefs extends BackgroundDefs> = {\n [K in keyof TDefs & string]: TDefs[K] extends QueueJobDefinition<\n any,\n any,\n any,\n any\n >\n ? K\n : never\n}[keyof TDefs & string]\n\n/** Throws when a definition is unusable. Safe to call more than once. */\nexport function validateBackgroundDefs(defs: BackgroundDefs): void {\n for (const [name, def] of Object.entries(defs)) {\n if (typeof def.handler !== 'function') {\n throw new Error(`[bunderstack] background task \"${name}\" has no handler`)\n }\n if (def.kind === 'job' && name.startsWith(CRON_PREFIX)) {\n throw new Error(\n `[bunderstack] job \"${name}\": the \"${CRON_PREFIX}\" prefix is reserved for cron tasks`,\n )\n }\n if (\n def.retries !== undefined &&\n (def.retries < 0 || !Number.isInteger(def.retries))\n ) {\n throw new Error(\n `[bunderstack] background task \"${name}\": retries must be a non-negative integer`,\n )\n }\n if (def.timeout !== undefined && def.leaseDuration !== undefined) {\n throw new Error(\n `[bunderstack] background task \"${name}\": timeout and leaseDuration cannot both be declared`,\n )\n }\n for (const field of ['timeout', 'leaseDuration', 'maxRuntime'] as const) {\n const value = def[field]\n if (\n value !== undefined &&\n (!Number.isFinite(value) || !Number.isInteger(value) || value <= 0)\n ) {\n throw new Error(\n `[bunderstack] background task \"${name}\": ${field} must be a positive finite integer`,\n )\n }\n }\n if (def.kind === 'cron') {\n parseCron(def.schedule)\n if ((def as { concurrency?: number }).concurrency !== undefined) {\n throw new Error(\n `[bunderstack] cron \"${name}\": concurrency is not supported for cron tasks — slots are already unique`,\n )\n }\n if (def.catchUpWindow !== undefined && def.catchUpWindow <= 0) {\n throw new Error(\n `[bunderstack] cron \"${name}\": catchUpWindow must be positive`,\n )\n }\n continue\n }\n if (\n def.concurrency !== undefined &&\n (def.concurrency < 1 || !Number.isInteger(def.concurrency))\n ) {\n throw new Error(\n `[bunderstack] job \"${name}\": concurrency must be a positive integer`,\n )\n }\n }\n}\n\n/** @deprecated Use validateBackgroundDefs. */\nexport const validateJobsDefs = validateBackgroundDefs\n\n/**\n * Delay in ms before retry `attempt` (1-based = the attempt that just failed).\n * Jittered by ±20% so a shared outage does not retry every job in lockstep.\n * A caller-supplied backoff function is returned verbatim — the caller owns it.\n */\nexport function backoffMs(\n def: AnyBackgroundDefinition,\n attempt: number,\n): number {\n const b = def.backoff\n if (typeof b === 'function') return b(attempt)\n const baseMs = b?.baseMs ?? 1000\n const factor = b?.factor ?? 2\n const flat = baseMs * factor ** (attempt - 1)\n return Math.round(flat * (0.8 + Math.random() * 0.4))\n}\n\n/**\n * Build the `j` instance bunderstack hands to the config's `jobs` builder\n * callback (and exports for multi-file job setups).\n */\nexport function createJobsBuilder<\n TSchema extends Record<string, unknown>,\n TEnvResult = Record<string, unknown>,\n TMessaging extends MessagingConfig | undefined = MessagingConfig,\n>() {\n return {\n /** Identity with inference: pins TInput from the schema output. */\n job<TInput = undefined>(\n def: Omit<\n QueueJobDefinition<TInput, TSchema, TEnvResult, TMessaging>,\n 'kind'\n >,\n ): QueueJobDefinition<TInput, TSchema, TEnvResult, TMessaging> {\n return { kind: 'job', ...def }\n },\n cron<const TSchedule extends string>(\n def: Omit<\n CronDefinition<TSchema, TEnvResult, TSchedule, TMessaging>,\n 'kind'\n >,\n ): CronDefinition<TSchema, TEnvResult, TSchedule, TMessaging> {\n parseCron(def.schedule)\n return { kind: 'cron', ...def }\n },\n /** Identity with validation: returns the defs map, typed. */\n define<TDefs extends BackgroundDefs>(defs: TDefs): TDefs {\n validateBackgroundDefs(defs)\n return defs\n },\n }\n}\n\n/** Type of the `j` instance — for builder callbacks declared in separate files. */\nexport type BunderstackJobsBuilder<\n TSchema extends Record<string, unknown>,\n TEnvResult = Record<string, unknown>,\n TMessaging extends MessagingConfig | undefined = MessagingConfig,\n> = ReturnType<typeof createJobsBuilder<TSchema, TEnvResult, TMessaging>>\n\n// Infers TInput from the JobDefinition's own type argument rather than\n// pattern-matching the (optional, so union-with-undefined) `input` property —\n// A required-property pattern fails structurally because `input` is optional,\n// so infer from the definition's own type argument instead.\ntype JobInputOf<TDef> =\n TDef extends QueueJobDefinition<infer TInput, any, any, any>\n ? TInput\n : undefined\n\n/**\n * `app.jobs`: `enqueue` narrowed to declared names + payloads. `Omit`s the\n * runtime facade's loose `enqueue` first — intersecting two same-named\n * methods instead would make TS treat them as overloaded, so the loose\n * `(name: string, ...)` signature would still accept any name.\n */\nexport type JobsFacade<TDefs extends JobsDefs> = Omit<\n JobsRuntimeFacade,\n 'enqueue'\n> & {\n enqueue<K extends QueueJobKeys<TDefs>>(\n name: K,\n ...rest: JobInputOf<TDefs[K]> extends undefined\n ? [input?: undefined, opts?: EnqueueOptions]\n : [input: JobInputOf<TDefs[K]>, opts?: EnqueueOptions]\n ): Promise<{ id: string }>\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/jobs/worker.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AACvC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AACnD,OAAO,KAAK,EAEV,QAAQ,EACR,iBAAiB,EACjB,UAAU,EACX,MAAM,UAAU,CAAA;AAqDjB,KAAK,UAAU,GAAG;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAAA;AAkD1C,wBAAgB,eAAe,CAAC,IAAI,EAAE;IACpC,EAAE,EAAE,KAAK,CAAA;IACT,IAAI,EAAE,QAAQ,CAAA;IACd,4EAA4E;IAC5E,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC5B,MAAM,CAAC,EAAE,iBAAiB,CAAA;CAC3B;eA0fmB,MAAM,GAAgB,OAAO,CAAC,UAAU,CAAC;iBAnBlC,MAAM,KAAgB,OAAO,CAAC,UAAU,CAAC;iBAa1C,OAAO,CAAC,IAAI,CAAC;iBAYhB,MAAM;;;;;;;;;;;;oBAiEb,SAAS,GACT,SAAS,GACT,WAAW,GACX,QAAQ;;;;;;;qBAQH,iBAAiB;EAIrC"}
1
+ {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/jobs/worker.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AACvC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AACnD,OAAO,KAAK,EAEV,QAAQ,EACR,iBAAiB,EACjB,UAAU,EACX,MAAM,UAAU,CAAA;AAqDjB,KAAK,UAAU,GAAG;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAAA;AAsD1C,wBAAgB,eAAe,CAAC,IAAI,EAAE;IACpC,EAAE,EAAE,KAAK,CAAA;IACT,IAAI,EAAE,QAAQ,CAAA;IACd,4EAA4E;IAC5E,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC5B,MAAM,CAAC,EAAE,iBAAiB,CAAA;CAC3B;eAqgBmB,MAAM,GAAgB,OAAO,CAAC,UAAU,CAAC;iBAnBlC,MAAM,KAAgB,OAAO,CAAC,UAAU,CAAC;iBAa1C,OAAO,CAAC,IAAI,CAAC;iBAYhB,MAAM;;;;;;;;;;;;oBAiEb,SAAS,GACT,SAAS,GACT,WAAW,GACX,QAAQ;;;;;;;qBAQH,iBAAiB;EAIrC"}
@@ -1,6 +1,6 @@
1
1
  // src/jobs/worker.ts — the queue worker. One `tick()` is a full cycle:
2
2
  // recover expired leases → reap old succeeded rows → claim and run queue jobs.
3
- import { and, eq, inArray, is, isNotNull, lt, lte, max, sql } from 'drizzle-orm';
3
+ import { and, desc, eq, inArray, is, isNotNull, lt, lte, sql, } from 'drizzle-orm';
4
4
  import { PgDatabase } from 'drizzle-orm/pg-core';
5
5
  import { jobsTableFor } from '../internal-tables.js';
6
6
  import { consoleLogger } from '../logging.js';
@@ -55,9 +55,9 @@ function definitionFor(defs, type) {
55
55
  const def = defs[type];
56
56
  return def?.kind === 'job' ? def : undefined;
57
57
  }
58
- /** Terminal queue rows release their dedupe key. */
59
- function terminalPatch() {
60
- return { dedupeKey: null };
58
+ /** Queue jobs release terminal dedupe keys; cron slots retain durable ownership. */
59
+ function terminalPatch(def) {
60
+ return def.kind === 'cron' ? {} : { dedupeKey: null };
61
61
  }
62
62
  export function createJobRunner(deps) {
63
63
  const { db, defs } = deps;
@@ -66,6 +66,7 @@ export function createJobRunner(deps) {
66
66
  const ctx = { ...deps.ctx };
67
67
  let lastReapAt = 0;
68
68
  const active = new Map();
69
+ const cronCursors = new Map();
69
70
  function ownershipPredicate(id, owner) {
70
71
  return and(eq(t.id, id), eq(t.status, 'running'), eq(t.attempts, owner.attempt), eq(t.lockedUntil, owner.lockedUntil));
71
72
  }
@@ -124,31 +125,38 @@ export function createJobRunner(deps) {
124
125
  ? validateStandardSchema(def.input, raw, 'job payload')
125
126
  : undefined;
126
127
  }
127
- /**
128
- * The watermark is the newest slot we already stored for this cron. When no
129
- * rows exist — a newly declared cron, or one whose rows were reaped — anchor
130
- * one slot before now so the current minute is eligible and nothing older is.
131
- */
132
- async function cronWatermark(type, now) {
128
+ /** Hydrate each cron cursor once, then advance it in this worker's memory. */
129
+ async function cronCursor(type, now) {
130
+ const cached = cronCursors.get(type);
131
+ if (cached)
132
+ return cached;
133
133
  const rows = await db
134
- .select({ latest: max(t.runAt) })
134
+ .select({ runAt: t.runAt })
135
135
  .from(t)
136
- .where(eq(t.type, type));
137
- const latest = rows[0]?.latest;
138
- return latest == null ? floorSlot(now) - SLOT_MS : Number(latest);
136
+ .where(eq(t.type, type))
137
+ .orderBy(desc(t.runAt))
138
+ .limit(1);
139
+ const cursor = {
140
+ checkedThrough: rows[0]?.runAt == null
141
+ ? floorSlot(now) - SLOT_MS
142
+ : Number(rows[0].runAt),
143
+ };
144
+ cronCursors.set(type, cursor);
145
+ return cursor;
139
146
  }
140
147
  /** Enqueue a row per due slot. The unique(type, dedupeKey) constraint makes
141
148
  * this safe to run concurrently in any number of processes. */
142
149
  async function materializeCronSlots(now) {
150
+ const through = floorSlot(now);
143
151
  for (const [name, def] of Object.entries(defs)) {
144
152
  if (def.kind !== 'cron')
145
153
  continue;
146
154
  const type = `${CRON_PREFIX}${name}`;
147
- const from = await cronWatermark(type, now);
155
+ const cursor = await cronCursor(type, now);
148
156
  const slots = slotsDue({
149
157
  cron: parseCron(def.schedule),
150
- from,
151
- to: now,
158
+ from: cursor.checkedThrough,
159
+ to: through,
152
160
  catchUp: def.catchUp,
153
161
  catchUpWindowMs: def.catchUpWindow,
154
162
  });
@@ -157,7 +165,9 @@ export function createJobRunner(deps) {
157
165
  runAt: slot,
158
166
  dedupeKey: String(slot),
159
167
  });
168
+ cursor.checkedThrough = slot;
160
169
  }
170
+ cursor.checkedThrough = Math.max(cursor.checkedThrough, through);
161
171
  }
162
172
  }
163
173
  async function fireOnFailed(def, input, error) {
@@ -212,7 +222,7 @@ export function createJobRunner(deps) {
212
222
  finishedAt: now,
213
223
  lockedUntil: null,
214
224
  lastError: error.message,
215
- ...terminalPatch(),
225
+ ...terminalPatch(def),
216
226
  })
217
227
  .where(ownershipPredicate(row.id, owner))
218
228
  .returning({ id: t.id });
@@ -312,7 +322,7 @@ export function createJobRunner(deps) {
312
322
  finishedAt: Date.now(),
313
323
  lockedUntil: null,
314
324
  lastError: e.message,
315
- ...terminalPatch(),
325
+ ...terminalPatch(def),
316
326
  })
317
327
  .where(ownershipPredicate(row.id, owner))
318
328
  .returning({ id: t.id });
@@ -361,13 +371,15 @@ export function createJobRunner(deps) {
361
371
  status: 'succeeded',
362
372
  finishedAt: Date.now(),
363
373
  lockedUntil: null,
364
- ...terminalPatch(),
374
+ ...terminalPatch(def),
365
375
  })
366
376
  .where(ownershipPredicate(row.id, owner))
367
377
  .returning({ id: t.id });
368
378
  if (!updated[0])
369
379
  return 'lost';
370
- logger.info(JSON.stringify(jobEvent('job.completed', row, { durationMs: Date.now() - startedAt })));
380
+ logger.info(JSON.stringify(jobEvent('job.completed', row, {
381
+ durationMs: Date.now() - startedAt,
382
+ })));
371
383
  return 'ran';
372
384
  }
373
385
  catch (err) {
@@ -405,7 +417,7 @@ export function createJobRunner(deps) {
405
417
  finishedAt: Date.now(),
406
418
  lockedUntil: null,
407
419
  lastError: e.message,
408
- ...terminalPatch(),
420
+ ...terminalPatch(def),
409
421
  })
410
422
  .where(ownershipPredicate(row.id, owner))
411
423
  .returning({ id: t.id });